HDFS 集群无法启动 DataNode 节点以及管理界面缺少 DataNode 节点的解决方法

前言

搭建了一个 HDFS 集群,用了 3 台虚拟机,1 台虚拟机是master作为NameNode节点;2 台虚拟机分别是slave1slave2作为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的目录下,例如:

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目录则会通过配置在集群启动时自动生成。

cat-version
如上图所示,在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文件有关。
datanode-usage-histogram

呃,不要纠结于上面的图为啥会显示两个数据节点,因为这是我把上述的问题解决之后的效果,懒得恢复原先的配置重新截图了,大家凑合看吧,捂脸!既然怀疑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

该命令执行的效果为:

hadoop dfsadmin -report

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

已标记关键词 清除标记
相关推荐
masters日志: java.io.IOException: File /home/wangzhengqi/tmp/mapred/system/jobtracker.info could only be replicated to 0 nodes, instead of 1 at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1920) at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:783) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:587) at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1432) at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1428) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190) at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1426) slaves日志:2015-04-19 11:19:45,137 INFO org.apache.hadoop.ipc.RPC: Server at ubuntu-2/192.168.128.129:9000 not available yet, Zzzzz... 查看任务: masters: root@ubuntu-2:/usr/hadoop/conf# jps 2897 TaskTracker 2386 DataNode 2177 NameNode 2603 SecondaryNameNode 2940 Jps 2684 JobTracker root@ubuntu-2:/usr/hadoop/conf# hadoop dfsadmin -report Configured Capacity: 20334034944 (18.94 GB) Present Capacity: 14065430543 (13.1 GB) DFS Remaining: 14065401856 (13.1 GB) DFS Used: 28687 (28.01 KB) DFS Used%: 0% Under replicated blocks: 1(这里应该是3台才对, 因为我还有两台子节点) Blocks with corrupt replicas: 0 Missing blocks: 0 slaves1:[root@centos-4 conf]# jps 1288 Jps 1163 DataNode 1225 TaskTracker slaves2:[root@centos-3 conf]# jps 1288 Jps 1163 DataNode 1225 TaskTracker start-all.sh后: 两台子节点datanode都 已经启动了, 就是链接 不上namenode,, 这到底是怎么回事, 请大神解答!!!1
找了很久都不知道解决方法,大家帮帮我吧,谢谢~ STARTUP_MSG: java = 1.6.0_45 ************************************************************/ 15/11/28 08:52:23 INFO namenode.NameNode: registered UNIX signal handlers for [TERM, HUP, INT] 15/11/28 08:52:23 INFO namenode.NameNode: createNameNode [-format] 15/11/28 08:52:24 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Formatting using clusterid: CID-0f5cc549-bfbb-45b2-a735-c3500a2e83cf 15/11/28 08:52:25 INFO namenode.FSNamesystem: fsLock is fair:true 15/11/28 08:52:25 INFO blockmanagement.DatanodeManager: dfs.block.invalidate.limit=1000 15/11/28 08:52:25 INFO blockmanagement.DatanodeManager: dfs.namenode.datanode.registration.ip-hostname-check=true 15/11/28 08:52:25 INFO blockmanagement.BlockManager: dfs.namenode.startup.delay.block.deletion.sec is set to 000:00:00:00.000 15/11/28 08:52:25 INFO blockmanagement.BlockManager: The block deletion will start around 2015 Nov 28 08:52:25 15/11/28 08:52:25 INFO util.GSet: Computing capacity for map BlocksMap 15/11/28 08:52:25 INFO util.GSet: VM type = 32-bit 15/11/28 08:52:25 INFO util.GSet: 2.0% max memory 966.7 MB = 19.3 MB 15/11/28 08:52:25 INFO util.GSet: capacity = 2^22 = 4194304 entries 15/11/28 08:52:25 INFO blockmanagement.BlockManager: dfs.block.access.token.enable=false 15/11/28 08:52:25 INFO blockmanagement.BlockManager: defaultReplication = 1 15/11/28 08:52:25 INFO blockmanagement.BlockManager: maxReplication = 512 15/11/28 08:52:25 INFO blockmanagement.BlockManager: minReplication = 1 15/11/28 08:52:25 INFO blockmanagement.BlockManager: maxReplicationStreams = 2 15/11/28 08:52:25 INFO blockmanagement.BlockManager: shouldCheckForEnoughRacks = false 15/11/28 08:52:25 INFO blockmanagement.BlockManager: replicationRecheckInterval = 3000 15/11/28 08:52:25 INFO blockmanagement.BlockManager: encryptDataTransfer = false 15/11/28 08:52:25 INFO blockmanagement.BlockManager: maxNumBlocksToLog = 1000 15/11/28 08:52:25 INFO namenode.FSNamesystem: fsOwner = hadoop (auth:SIMPLE) 15/11/28 08:52:25 INFO namenode.FSNamesystem: supergroup = supergroup 15/11/28 08:52:25 INFO namenode.FSNamesystem: isPermissionEnabled = false 15/11/28 08:52:25 INFO namenode.FSNamesystem: HA Enabled: false 15/11/28 08:52:25 INFO namenode.FSNamesystem: Append Enabled: true 15/11/28 08:52:26 INFO util.GSet: Computing capacity for map INodeMap 15/11/28 08:52:26 INFO util.GSet: VM type = 32-bit 15/11/28 08:52:26 INFO util.GSet: 1.0% max memory 966.7 MB = 9.7 MB 15/11/28 08:52:26 INFO util.GSet: capacity = 2^21 = 2097152 entries 15/11/28 08:52:26 INFO namenode.NameNode: Caching file names occuring more than 10 times 15/11/28 08:52:26 INFO util.GSet: Computing capacity for map cachedBlocks 15/11/28 08:52:26 INFO util.GSet: VM type = 32-bit 15/11/28 08:52:26 INFO util.GSet: 0.25% max memory 966.7 MB = 2.4 MB 15/11/28 08:52:26 INFO util.GSet: capacity = 2^19 = 524288 entries 15/11/28 08:52:26 INFO namenode.FSNamesystem: dfs.namenode.safemode.threshold-pct = 0.9990000128746033 15/11/28 08:52:26 INFO namenode.FSNamesystem: dfs.namenode.safemode.min.datanodes = 0 15/11/28 08:52:26 INFO namenode.FSNamesystem: dfs.namenode.safemode.extension = 30000 15/11/28 08:52:26 INFO namenode.FSNamesystem: Retry cache on namenode is enabled 15/11/28 08:52:26 INFO namenode.FSNamesystem: Retry cache will use 0.03 of total heap and retry cache entry expiry time is 600000 millis 15/11/28 08:52:26 INFO util.GSet: Computing capacity for map NameNodeRetryCache 15/11/28 08:52:26 INFO util.GSet: VM type = 32-bit 15/11/28 08:52:26 INFO util.GSet: 0.029999999329447746% max memory 966.7 MB = 297.0 KB 15/11/28 08:52:26 INFO util.GSet: capacity = 2^16 = 65536 entries 15/11/28 08:52:26 INFO namenode.NNConf: ACLs enabled? false 15/11/28 08:52:26 INFO namenode.NNConf: XAttrs enabled? true 15/11/28 08:52:26 INFO namenode.NNConf: Maximum size of an xattr: 16384 15/11/28 08:52:26 FATAL namenode.NameNode: Exception in namenode join java.lang.IllegalArgumentException: URI has an authority component at java.io.File.<init>(File.java:368) at org.apache.hadoop.hdfs.server.namenode.NNStorage.getStorageDirectory(NNStorage.java:327) at org.apache.hadoop.hdfs.server.namenode.FSEditLog.initJournals(FSEditLog.java:261) at org.apache.hadoop.hdfs.server.namenode.FSEditLog.initJournalsForWrite(FSEditLog.java:233) at org.apache.hadoop.hdfs.server.namenode.NameNode.format(NameNode.java:920) at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1354) at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1473) 15/11/28 08:52:26 INFO util.ExitUtil: Exiting with status 1 15/11/28 08:52:26 INFO namenode.NameNode: SHUTDOWN_MSG: /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at hadoop/192.168.131.2 ************************************************************/
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值