一、问题描述
如题,在搭建Hadoop完全分布式模式时,启动hadoop之后在master\slaver1\slaver2节点使用JPS命令行后显示master节点的NameNode以及slaver1节点的DataNode节点未正常启动
二、问题原因
A、master 节点看不到 NameNode(异常)的常见原因
1、集群未格式化或格式化后重新启动
第一次启动 HDFS 前必须执行 hdfs namenode -format,如果没格式化,NameNode 不会启动;如果格式化多次且未清理数据目录,会导致集群 ID 不匹配,NameNode 启动失败。
Hadoop 格式化(hdfs namenode -format)会生成唯一的 clusterID,如果多次格式化,NameNode 的clusterID 会更新,但 DataNode 保留旧 ID,导致两者无法通信,最终表现为 DataNode 启动失败
2、配置文件错误(最常见)
core-site.xml 或 hdfs-site.xml 配置错误,比如 fs.defaultFS 地址写错、NameNode 数据目录权限不足。
B、slaver 节点没有 DataNode 的常见原因
1、集群格式化后,DataNode 节点的 clusterID 不匹配(最常见)
多次执行 hdfs namenode -format,导致 NameNode 的 clusterID 变更,但各 slaver 节点上旧的 DataNode 数据目录还保留,ID 对不上,DataNode 启动失败。
2、配置文件未同步到 slaver 节点
在 master 上修改了 core-site.xml / hdfs-site.xml,但没通过 xsync 同步到 slaver1/slaver2,导致 DataNode 找不到 NameNode 地址。
注意:在从master节点分发时,要保持slaver1节点和slaver2节点都在线
3、master 到 slaver 的免密登录未配置
start-dfs.sh 启动时,master 需要通过 SSH 免密登录到 slaver 节点,启动 DataNode 进程。如果免密失败,DataNode 不会启动。
总的来说,这两个问题通常是配置 / 数据目录 / 网络 三类问题导致,且 NameNode 未启动是 "主因"(DataNode 依赖 NameNode 存活,NameNode 挂了,DataNode 也会启动失败)。
所以需要 "先解决 NameNode(核心)"→ "再解决 DataNode"
三、解决步骤
思路:首先尝试了重新启动节点和hadoop,发现重启之后依旧未能正常启动,然后排除了网络、配置文件的问题,因此决定再重新分发一次+格式化后再启动
1、如果hadoop还在运行,首先需要停止所有 Hadoop 服务(必须先停,否则删文件会出问题)
bash
# 停止 HDFS 和 YARN 所有服务
stop-dfs.sh
stop-yarn.sh
# 确保残留进程都被杀死(可选,更彻底)
jps | grep -E 'NameNode|DataNode|ResourceManager|NodeManager' | awk '{print $1}' | xargs kill -9 2>/dev/null
2、重新分发需要先清除NameNode数据目录和DataNode数据目录
找到目录有两种方法
(1)、直接看配置文件
打开core-site.xml文件,找到
bash
<property>
<name>hadoop.tmp.dir</name>
<value> >/opt/module/hadoop-3.1.3/data </value>
</property>
这几行配置,因为hadoop.tmp.dir是用来指定Hadoop临时数据的存储目录,所以<value></value>之间的就是路径
(2)使用命令行查看(推荐)
bash
#查看namenode路径
hdfs getconf -confKey dfs.namenode.name.dir
hdfs getconf -confKey dfs.datanode.data.dir
hdfs getconf -confKey hadoop.tmp.dir
(3)得到路径之后,在 master 节点批量清理(也可在每个节点上单独清理,但这样麻烦,不建议)
直接在master节点上输入下列代码
bash
# 批量清理 master、slaver1、slaver2 的旧数据
for host in master slaver1 slaver2
do
echo "==================== 正在清理 $host 节点的旧数据 ===================="
# 清理 NameNode 数据(仅 master 有,slaver 节点会自动忽略)
ssh $host "rm -rf /opt/module/hadoop-3.1.3/data/dfs/name/* 2>/dev/null"
# 清理 DataNode 数据(所有节点都有)
ssh $host "rm -rf /opt/module/hadoop-3.1.3/data/dfs/data/* 2>/dev/null"
# 额外清理 Hadoop 临时目录(避免残留缓存)
ssh $host "rm -rf /opt/module/hadoop-3.1.3/tmp/* 2>/dev/null"
echo "$host 节点清理完成!"
done
注意:这里/opt/module/hadoop-3.1.3/data/dfs/name/需要修改为自己的路径
终端会依次显示如下内容,说明清理在逐个节点执行:
==================== 正在清理 master 节点的旧数据 ====================
master 节点清理完成!
==================== 正在清理 slaver1 节点的旧数据 ====================
slaver1 节点清理完成!
==================== 正在清理 slaver2 节点的旧数据 ====================
slaver2 节点清理完成!
运行结束后验证清理结果:
先在master上验证:
bash
ls -l /opt/module/hadoop-3.1.3/data/dfs/name/
然后任选一个节点验证:
bash
ls -l /opt/module/hadoop-3.1.3/data/dfs/data/
✅ 正常输出:total 0(目录为空),说明已被彻底删除。
(4)接下来就可以正常格式化+重启了
重启之后会发现都正常启动了