hadoop 3.x完全分布式集群成功运行的关键在于节点间通信畅通、配置准确、环境变量生效且启动顺序正确;需确保hosts映射一致、ssh免密双向验证、core-site.xml中fs.defaultfs使用主机名而非ip、workers文件无空行空格、hadoop.tmp.dir提前创建并赋权、namenode首次启动前必须格式化并检查日志,且各节点jdk版本必须统一兼容。

hadoop-3.x 完全分布式在 Linux 下能跑起来,关键不是“装完就行”,而是**节点间通信通、配置对、环境变量真生效、启动顺序不乱**。跳过任意一环,jps 看不到 DataNode 或 NodeManager 是常态。
网络与主机名必须提前对齐
三台机器之间 ping 不通、ssh hadoop102 提示 unknown host,后面所有配置都是白忙。这不是 Hadoop 的问题,是 Linux 基础没铺平。
- 每台机器的
/etc/hosts必须包含全部节点映射(不能只写本机),例如:192.168.10.100 hadoop100<br>192.168.10.101 hadoop101<br>192.168.10.102 hadoop102
- 主机名用
hostnamectl set-hostname hadoop100设置,且重启后仍生效(检查hostname输出是否匹配/etc/hosts里的 key) - 静态 IP 要配在
/etc/sysconfig/network-scripts/ifcfg-ens33里,别依赖 DHCP;子网掩码、网关、DNS 都得一致
免密登录必须双向验证
很多人只在 master 上执行 ssh-copy-id,结果从 hadoop101 启动 DataNode 时卡住——因为 hadoop101 没法无密码 ssh 到自己或 hadoop102。
- 每台机器都要生成密钥:
ssh-keygen -t rsa -P ''(空密码) - 每台机器都要把自身的
id_rsa.pub追加进自己的~/.ssh/authorized_keys(即 localhost 免密) - 再统一从 master 执行:
ssh-copy-id hadoop101和ssh-copy-id hadoop102,然后立刻验证:ssh hadoop101 hostname和ssh hadoop102 hostname - 如果提示输入密码,说明
~/.ssh权限不对:确保chmod 700 ~/.ssh,chmod 600 ~/.ssh/authorized_keys
core-site.xml 和 workers 文件最容易写错
这两个文件出错,start-dfs.sh 表面成功,但 DataNode 根本不注册;start-yarn.sh 启动后 NodeManager 在 jps 里消失。
-
core-site.xml中fs.defaultFS的值必须是hdfs://<namenode-hostname>:9000</namenode-hostname>,不是 IP,也不是localhost—— hostname 必须和/etc/hosts里定义的一致 -
workers(Hadoop 3.x 替代了旧版slaves)每行只写一个 hostname,末尾不能有空格,文件不能有空行,也不能有 Windows 换行符(用dos2unix workers清理) -
hadoop.tmp.dir路径要提前创建并赋权:mkdir -p /opt/module/hadoop-3.3.6/data,然后chown -R $USER:$USER /opt/module/hadoop-3.3.6/data
启动前必须格式化且确认日志输出
第一次启动不格式化 NameNode,start-dfs.sh 会静默失败;格式化后不看 $HADOOP_HOME/logs/ 下的 hadoop-*-namenode-*.log,就等于蒙眼开车。
- 只在 NameNode 所在节点执行:
hdfs namenode -format(注意不是hadoop namenode -format,后者已弃用) - 启动后立刻查日志:
tail -n 20 $HADOOP_HOME/logs/hadoop-*-namenode-*.log | grep -i error,重点看是否有Failed to start namenode或Address already in use - 确认端口没被占:
netstat -tulnp | grep :9000(NameNode)、:8020(IPC)、:8088(YARN UI) -
jps在各节点分别执行:NameNode 节点应有NameNode、SecondaryNameNode(如果配了)、ResourceManager;DataNode 节点应有DataNode、NodeManager
java -version 输出是 OpenJDK 11,而 Hadoop 3.3+ 明确要求 JDK 8 或 JDK 11(但必须一致);或是 HADOOP_HOME 在 /etc/profile 里设了,却忘了在 ~/.bashrc 里也 export,导致 start-dfs.sh 找不到命令。这些细节不逐台验证,集群永远“看起来启动了”。











