hadoop集群中DataNode启动失败

前言

搭建了一个 HDFS 集群,用了 3 台虚拟机,1 台虚拟机是master作为NameNode节点;2 台虚拟机分别是slave1和slave2作为DataNode节点,具体的集群搭建过程可参考「快速搭建 HDFS 系统(超详细版)」这篇博文。

1 问题描述

在搭建 HDFS 集群的过程中,难免会遇到一些稀奇古怪的问题,就如我遇到的这个问题一样:

ISSUE 1,HDFS 集群搭建并启动成功,1 个NameNode节点和 2 个DataNode节点也运行正常, 可以在各自的虚拟机中用jps命令查看正在运行的 Java 进程,但是通过http://master:50070/dfshealth.html#tab-datanode查看数据节点,却发现可视化管理界面仅显示了一个DataNode节点,另一个数据节点缺失。

在尝试解决这个问题的时候,又遇到了另一个问题,即

ISSUE 2,在 HDFS 集群关闭后,使用hdfs namenode -format命令刷新NameNode节点格式,重新启动集群,发现仅能成功启动NameNode节点,而两个DataNode节点启动失败。

接下来,我们就尝试解决上面的两个问题。

2 尝试解决

虽然我们是先遇到ISSUE 1,后遇到ISSUE 2的,但想要继续调试集群,我们显然要先解决ISSUE 2,让集群正常跑起来;否则的话,集群连一个数据节点都连接不上,何谈界面显示的问题啊?因此,我们首先来看看ISSUE 2该如何解决。

2.1 解决 ISSUE 2

在启动集群的时候,我们可以通过集群日志来查看错误信息,默认的日志位置在 Hadoop 的安装目录的logs的目录下,例如:

在这里插入图片描述

如上图所示,在我们进入到logs目录之后,可以使用tail命令来还查看日志,例如:

tail -1000f hadoop-root-namenode-localhost.localdomain.log

同理,我们也可以到各个DataNode对应的logs目录查看数据节点的日志信息,其会记录集群在启动和运行过程中的日志信息,如果出现异常或者错误,查看对应的日志文件是一个很好的定位问题的方法。

而之所以会出现ISSUE 2这样的问题,其根本原因在于我们使用hdfs namenode -format命令刷新NameNode节点的格式后,会重新生成集群的相关信息,特别是clusterID,每次刷新都会生成一个新的clusterID;但是当我们在NameNode节点所在的虚拟机刷新格式后,并不会影响DataNode节点,也就是说,那 2 台配置DataNode节点的虚拟机上关于集群的信息并不会刷新,仍保留上一次(未刷新NameNode格式前)的集群信息,这就导致了NameNode节点和DataNode节点的clusterID不一致的情况,因此DataNode节点不能连接到NameNode节点。我们可以到 Hadoop 安装目录下的/etc/hadoop目录下:
在这里插入图片描述

etc-hadoop-hdfs-site
查看hdfs-site.xml文件来获取 Hadoop 数据存储的位置,当然,这个位置也是我们之前在配置集群时设置的:
在这里插入图片描述

hadoop-data-dir
其中,hadoopData目录为我事先创建的存储 Hadoop 数据的目录,而/dfs/name和/dfs/data目录则会通过配置在集群启动时自动生成。
在这里插入图片描述

如上图所示,在hadoopData/dfs/name/current目录下,有一个名为VERSION的文件,该文件就包含了 HDFS 集群的信息,我们可以使用cat VERSION命令来查看VERSION文件的内容。同样,在DataNode节点也会自动生成该文件!因此,在出现ISSUE 2问题的时候,如果我们分别查看NameNode节点和DataNode节点的VERSION文件的话,我们将会发现两者的clusterID不一样。

解决ISSUE 2的方法:停止 HDFS 集群后,同时删除NameNode节点和DataNode节点中配置的存储 Hadoop 数据的文件目录的所有子目录及文件,如我们配置的hadoopData目录下的所有子目录及文件。接下来,再使用hdfs namenode -format命令重新格式化NameNode节点,然后重新启动 HDFS 集群,即可!

在把ISSUE 2的问题解决之后,我们再看看ISSUE 1该如何解决?

2.1 解决 ISSUE 1

为了解决ISSUE 1,我也在网上搜了很多文章,这些文章给出的解决方法可以归纳为两个,分别为:

方法 1:修改各个节点的hdfs-site.xml配置文件中配置的dfs.datanode.data.dir目录,保持在NameNode节点和DataNode节点中,该配置的数据存储路径各不相同。例如

  <!--- NameNode master 节点---> 
<property>  
<name>dfs.datanode.data.dir</name> 
<value>/home/hdfs-cg/hadoopData/dfs/data</value> 
</property> 
<!--- DataNode slave1 节点--->
 <property>
  <name>dfs.datanode.data.dir</name> 
  <value>/home/hdfs-cg/hadoopData/dfs/slave1data</value>
   </property>
   <!--- DataNode slave2 节点--->
   <property> 
    <name>dfs.datanode.data.dir</name> 
    <value>/home/hdfs-cg/hadoopData/dfs/slave2data</value> 
    </property> 

方法 2:在各个节点的hdfs-site.xml配置文件中配置dfs.namenode.datanode.registration.ip-hostname-check属性,并将其值设置为false,例如

<property>
  <name>dfs.namenode.datanode.registration.ip-hostname-check</name>
    <value>false</value> 
   </property> 

说实话,无论是 方法 1 还是 方法 2,我都尝试了,但都没有成功。不过看大家的反馈,既有说通过 方法 1 解决问题的,也有说通过 方法 2 解决问题的!具体效果如何,大家可以自行尝试。特别的,对于 方法 2,我特意查了查该属性的含义,该属性默认为ture,表示NameNode节点连接DataNode时会进行host解析查询,感觉这个方法还是比较靠谱的。实际上,对于我遇到的问题,方法 2 理论上应该是可以解决问题的,但实际上并没有解决,可能是某些配置冲突了,或者是有优先级的问题。

不过在观察Datanode usage histogram的时候,我发现了一个问题,那就是唯一显示出来的DataNode节点的主机名显示为localhost,而且随着我多次重启 HDFS 集群,虽然主机名不变,都为localhost,但是主机名后面跟着的IP会变化,在两个启动的数据节点中不断切换,因此在这里插入图片描述
我怀疑这可能和我配置的hosts文件有关。

呃,不要纠结于上面的图为啥会显示两个数据节点,因为这是我把上述的问题解决之后的效果,懒得恢复原先的配置重新截图了,大家凑合看吧,捂脸!既然怀疑hosts文件有问题,那我们就看看我的hosts文件到底都配置啥了:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

10.123.456.38 master
10.123.456.39 slave1
10.123.456.40 slave2

如上述所示,我配置的 3 台虚拟机的hosts文件的内容均是如此,而在我把前两个映射注释掉之后,也就是修改为:

#127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

10.123.456.38 master
10.123.456.39 slave1
10.123.456.40 slave2

这时,再次验证集群的启动效果,我们就会发现ISSUE 1也随之解决啦!因此,我们也知道了ISSUE 1的解决方法。

解决ISSUE 1的方法:修改虚拟机的hosts文件,保证每个节点的主机名都各不相同。

3 总结

在集群环境中,节点加入集群的一个条件就是节点与集群拥有统一的标识,如 HDFS 集群的clusterID,也如 es 集群的cluster.name,因此对于ISSUE 2这样由于clusterID不一致而导致数据节点不能加入集群的问题,也就再正常不过了。因此,要么在格式化之后,保持各节点的标识信息一致,要么就不要格式化。

通过解决ISSUE 1,我们知道了在 HDFS 集群的图形化管理界面的Datanode usage histogram中,显示的数据节点是根据主机名进行区分的,如果数据节点的主机名都相同,就是导致虽然数据节点正常启动,但却不会在管理界面中显示的问题。至于我们如何判断数据节点是否正常启动,可以使用如下命令:

hdfs dfsadmin -report

该命令执行的效果为:

在这里插入图片描述

最后,在实际操作中,遇到问题是难免的,也是正常的,虽然看到问题还是会让我们感到闹心,但当问题解决的一刹那,我们得到幸福感和愉悦感是难以形容的,而且每解决一个问题,都会让我们的自信心得到提升,加油吧,少年!

转载:https://blog.youkuaiyun.com/qq_35246620/article/details/88657826

4 最快方法

在你配置集群的时候,三台机器一定最少有一台没有hadoop namenode -format 过吧,直接用xsync 把这个机器上的hadoop往其他机器上传就行了,然后三台机器reboot ,你在启namenode和datanode,你会发现都开启了,哈哈哈哈哈。

<think>好的,我现在要解决用户在Linux虚拟机Hadoop集群启动DataNode失败的问题。首先,我需要回想一下常见的原因,然后逐步分析可能的解决方法。 首先,HadoopDataNode启动失败可能有多种原因,比如配置错误、端口冲突、权限问题、磁盘空间不足或者日志中的具体错误信息。我需要引导用户一步步排查这些问题。 第一步,检查配置文件。用户需要确认hdfs-site.xml和core-site.xml中的配置是否正确,特别是namenode的地址和端口,以及DataNode的数据目录是否存在且权限正确。例如,core-site.xml中的fs.defaultFS应该指向正确的NameNode地址,而hdfs-site.xml中的dfs.datanode.data.dir指定的目录需要存在,并且用户(比如hadoop用户)有读写权限。 第二步,检查端口冲突。DataNode默认使用50010端口,用户需要用netstat或者lsof查看这个端口是否被其他进程占用。如果被占用,可能需要修改配置文件中的端口号或者终止占用端口的进程。 第三步,查看日志文件。Hadoop的日志通常存放在logs目录下,特别是DataNode的日志文件,比如hadoop-<username>-datanode-<hostname>.log。用户需要查看最新的错误信息,根据具体的错误提示来定位问题,比如权限被拒绝、无法连接NameNode等。 第四步,检查磁盘空间。如果DataNode所在的磁盘空间不足,可能导致启动失败。用户可以用df -h命令检查磁盘使用情况,清理不必要的文件或者扩容磁盘。 第五步,检查防火墙或SELinux设置。有时候防火墙会阻止Hadoop节点之间的通信,用户需要确保相关端口(如50010、50070等)是开放的,或者临时关闭防火墙测试是否是这个问题。同样,SELinux可能会限制Hadoop进程的访问,可以尝试暂时禁用SELinux看看是否解决问题。 第六步,格式化NameNode后的影响。如果用户之前格式化过NameNode,但没有清理DataNode的数据目录,可能会导致集群ID不一致。这时候需要删除DataNode目录下的所有数据,重新格式化NameNode,并确保所有节点使用相同的集群ID。检查VERSION文件中的clusterID是否一致。 第七步,检查网络连接。DataNode需要能够与NameNode通信,用户可以用ping或者telnet命令测试网络连通性,确保没有网络问题导致连接失败。 第八步,检查Java环境。Hadoop依赖Java,用户需要确认JAVA_HOME环境变量是否正确配置,并且Java版本与Hadoop兼容。可以通过运行java -version和hadoop version来验证。 第九步,尝试手动启动DataNode。用户可以用hadoop-daemon.sh start datanode命令手动启动,观察终端输出的错误信息,这可能会提供更直接的线索。 第十步,检查主机名和hosts文件配置。确保所有节点的/etc/hosts文件中包含了正确的IP和主机名映射,避免因为主机名解析错误导致通信失败。 如果以上步骤都检查过,但问题仍未解决,用户需要提供具体的错误日志内容,这样可以更精确地定位问题所在。例如,如果日志中出现“java.net.BindException: 地址已在使用”,说明端口冲突;如果是权限问题,日志中可能会有“Permission denied”等提示。根据具体错误信息,可以针对性地解决。</think>Linux虚拟机Hadoop集群启动DataNode失败可能由多种原因导致,以下是逐步排查和解决的指南: --- ### **1. 检查配置文件** - **核心文件验证** 确保 `hdfs-site.xml` 和 `core-site.xml` 配置正确: - **`core-site.xml`**:检查NameNode地址(`fs.defaultFS`)是否指向正确的主机和端口(如`hdfs://namenode-host:9000`)。 - **`hdfs-site.xml`**:确认DataNode数据目录(`dfs.datanode.data.dir`)是否存在,且权限正确(如用户`hadoop`有读写权限)。 - **权限问题** ```bash # 示例:检查目录权限 ls -ld /path/to/datanode/dir # 若权限不足,修复: chown -R hadoop:hadoop /path/to/datanode/dir chmod 755 /path/to/datanode/dir ``` --- ### **2. 端口冲突检查** DataNode默认使用端口 `50010`,检查是否被占用: ```bash netstat -tuln | grep 50010 # 或 lsof -i :50010 ``` - **解决方案** - 终止占用进程,或修改 `hdfs-site.xml` 中的 `dfs.datanode.address` 配置: ```xml <property> <name>dfs.datanode.address</name> <value>0.0.0.0:50011</value> <!-- 更换新端口 --> </property> ``` --- ### **3. 查看日志定位错误** 日志文件路径:`$HADOOP_HOME/logs/hadoop-<用户名>-datanode-<主机名>.log` - **关键错误示例**: - **权限拒绝**:`java.io.IOException: Permission denied` 检查数据目录权限和SELinux状态。 - **连接NameNode失败**:`java.net.ConnectException: Connection refused` 验证NameNode是否已启动,网络是否互通。 --- ### **4. 磁盘空间不足** 检查磁盘使用情况: ```bash df -h ``` - 如果空间不足,清理数据或扩容磁盘。 --- ### **5. 防火墙/SELinux限制** - **关闭防火墙测试**(临时): ```bash systemctl stop firewalld # CentOS ufw disable # Ubuntu ``` - **禁用SELinux**: ```bash setenforce 0 # 临时关闭 # 永久关闭需修改 /etc/selinux/config ``` --- ### **6. 集群ID不一致** 格式化NameNode会生成新集群ID,若DataNode未同步会导致失败- **检查步骤**: 1. 对比NameNodeDataNode的 `VERSION` 文件: - NameNode路径:`/path/to/namenode/current/VERSION` - DataNode路径:`/path/to/datanode/current/VERSION` 2. 若ID不一致,解决方案: ```bash # 删除DataNode数据目录 rm -rf /path/to/datanode/dir/* # 重新格式化NameNode(谨慎操作!会丢失元数据) hdfs namenode -format # 重启HDFS ``` --- ### **7. 手动启动DataNode调试** 通过命令手动启动并观察输出: ```bash hadoop-daemon.sh start datanode # 或 hdfs --daemon start datanode ``` - 终端输出的错误信息可能比日志更直接。 --- ### **8. 网络与主机名解析** - **验证主机名映射**: 确保所有节点的 `/etc/hosts` 包含集群主机名和IP: ```plaintext 192.168.1.100 namenode 192.168.1.101 datanode1 ``` - **测试连通性**: ```bash ping namenode telnet namenode 9000 # 检查NameNode端口 ``` --- ### **9. Java环境验证** - 检查 `JAVA_HOME` 是否在 `hadoop-env.sh` 中正确设置: ```bash echo $JAVA_HOME # 确认Java版本兼容性(Hadoop 3.x需Java 8+) java -version ``` --- ### **总结步骤** 1. **查日志** → 定位具体错误 2. **验配置** → 核对端口、目录权限 3. **排冲突** → 端口占用、防火墙 4. **清数据** → 解决集群ID不一致 5. **测网络** → 确保节点间通信正常 如果问题仍未解决,请提供具体日志错误片段,以便进一步分析!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑色的小德牧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值