1. 环境准备:Linux系统与基础配置

第一次在Linux上搭建Hadoop伪分布式环境时,我花了整整两天时间才搞定所有依赖。这里分享几个新手容易忽略的关键点:首先建议使用Ubuntu 20.04 LTS或CentOS 7这类主流发行版,避免在冷门系统上踩兼容性坑。我测试过在4核CPU/8GB内存的虚拟机就能流畅运行,但硬盘空间建议预留50GB以上,因为Hadoop的日志文件增长速度快得惊人。

系统装好后第一件事是更新软件源,这个步骤很多教程会跳过,但实际非常重要:

sudo apt update && sudo apt upgrade -y  # Ubuntu/Debian
sudo yum update -y  # CentOS/RHEL

接着安装基础工具链,后面会频繁用到:

sudo apt install -y ssh pdsh vim net-tools  # Ubuntu
sudo yum install -y openssh-clients pdsh vim net-tools  # CentOS

注意:如果使用虚拟机环境,务必确认BIOS已开启虚拟化支持。我在旧笔记本上遇到过VT-x未启用导致Hadoop启动失败的案例,用egrep -c '(vmx|svm)' /proc/cpuinfo命令检查返回值应大于0。

2. JDK安装:版本选择与环境变量配置

Hadoop 3.x官方推荐使用JDK 8或11,但实测发现不同小版本间存在细微差异。我最推荐OpenJDK 1.8.0_342这个经过充分验证的版本,用以下命令安装:

sudo apt install -y openjdk-8-jdk  # Ubuntu
sudo yum install -y java-1.8.0-openjdk-devel  # CentOS

环境变量配置是新手最容易出错的地方。建议在~/.bashrc/etc/profile中都添加配置,避免切换用户时失效:

echo 'export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))' >> ~/.bashrc
echo 'export PATH=$PATH:$JAVA_HOME/bin' >> ~/.bashrc
source ~/.bashrc

验证安装时别只用java -version,还要检查javac是否可用:

java -version  # 应显示1.8.x
javac -version  # 应与java版本一致

遇到JAVA_HOME not set错误时,可以手动指定路径。我在CentOS 7上就遇到过默认安装路径不一致的问题,最终用find /usr/lib/jvm -name "javac"定位到了真实路径。

3. SSH免密登录:密钥生成与权限管理

伪分布式模式要求本机SSH免密登录,这里有个隐藏坑点:如果.ssh目录权限不对,配置会完全失效。正确的操作流程是:

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

测试时不要简单用ssh localhost,建议加上-v参数看详细日志:

ssh -v localhost  # 观察认证过程

如果遇到Permission denied错误,检查三个地方:

  1. /etc/ssh/sshd_configPubkeyAuthentication应为yes
  2. 用户home目录权限不能是777(需750)
  3. SELinux状态可能导致问题,临时关闭用setenforce 0

4. Hadoop安装与核心配置

下载Hadoop时建议用国内镜像源,清华大学的镜像速度很快:

wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz
tar -zxvf hadoop-3.3.4.tar.gz -C /opt
mv /opt/hadoop-3.3.4 /opt/hadoop

环境变量配置要特别注意Hadoop的路径:

echo 'export HADOOP_HOME=/opt/hadoop' >> ~/.bashrc
echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> ~/.bashrc

配置文件修改是重中之重,这几个文件必须仔细核对:

  1. etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64  # 根据实际路径修改
export HADOOP_SSH_OPTS="-p 22"  # 如果SSH端口不是22需指定
  1. etc/hadoop/core-site.xml
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/hadoop/tmp</value>
    </property>
</configuration>
  1. etc/hadoop/hdfs-site.xml
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/opt/hadoop/hdfs/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/opt/hadoop/hdfs/datanode</value>
    </property>
</configuration>

5. 初始化与故障排查

格式化NameNode前务必确认数据目录不存在:

hdfs namenode -format  # 首次初始化

启动时建议分步验证:

start-dfs.sh
jps  # 应看到NameNode/DataNode/SecondaryNameNode

常见错误解决方案:

  1. WARN util.NativeCodeLoader:
echo 'export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"' >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh
  1. 端口占用问题:
netstat -tulnp | grep java  # 查看冲突进程
  1. 网页界面无法访问: 检查etc/hadoop/hdfs-site.xml中的dfs.http.address配置,防火墙需开放9870端口

最后验证HDFS是否正常工作:

hdfs dfs -mkdir /test
hdfs dfs -put localfile /test
hdfs dfs -ls /test

更多推荐