Hadoop之namenode不显示datanode

最近在浅玩Hadoop,配置HDFS时,遇到两个小问题,记之.
首先介绍下概况:
centos8和hadoop2.10.0,三台虚机,分配地址分别为.41 .42和.43,准备在.41机器上搭建namenode和datanode,另外两台分别搭建一个datanode.
先看下最后解决完问题后的成果:
在这里插入图片描述
问题来源1:第一台机器按照Hadoop官网配置NameNode和DataNode完成后,将Hadoop原封不动,发到剩余两台机器上.启动第一台机器,看到了通过localhost:50070可视化管理页面,成功看到.41机器上的datanode,启动剩余两台机器上的datanode

/opt/modules/hadoop-2.10.0/sbin/hadoop-daemon.sh start datanode

刷新可视化管理页面,看不到新增的两个datanode;刚接触,萌萌哒,又格式化了一下namenode

sh /opt/modules/hadoop-2.10.0bin/hdfs namenode -format

结果,.41机器上的datanode也看不见了
原因:
每次格式化namenode,会重新生成namenode的cluster id,datanode是通过cluster id关联namenode的,重新格式化namenode,导致cluster id不一致.
解决:
先将namenode和datanode停掉;
从可视化管理页面上获取到namenode的cluster id,到

/tmp/hadoop-kfk/dfs/data/current

目录下,修改VERSION文件中clusterId修改为和namenode一致即可.VERSION文件内容如下所示:

#Sun Apr 05 02:51:06 EDT 2020
storageID=DS-b8b82bb9-7a63-44e3-8059-f4e3454e6f14
clusterID=CID-2e8e4958-6c63-4b8d-b1f2-fe83e60507c8
cTime=0
datanodeUuid=fd21548b-487f-4f5c-83c4-40afe71d7fcf
storageType=DATA_NODE
layoutVersion=-57

问题2:如上所述,修改剩下两台机器上的datanode cluster id后,还是看不到这两台机器上的节点.
原因:
查看datanode日志:

/opt/modules/hadoop-2.10.0/logs/hadoop-kfk-datanode-bigdata-pro02.kfk.com.log

发现如下错误:

RROR 
org.apache.hadoop.hdfs.server.datanode.DataNode: 
Initialization failed for Block pool BP-650590083-192.168.3.41-1586066867333 
(Datanode Uuid c59de579-cdd4-420e-804e-7e931691814f) service to bigdata-pro01.kfk.com/192.168.3.41:9000 Datanode denied communic
ation with namenode because hostname cannot be resolved (ip=192.168.3.45, hostname=192.168.3.45): DatanodeRegistration(0.0.0.0:50010, datanode
Uuid=c59de579-cdd4-420e-804e-7e931691814f, infoPort=50075, infoSecurePort=0, ipcPort=50020, storageInfo=lv=-57;cid=CID-2e8e4958-6c63-4b8d-b1f2
-fe83e60507c8;nsid=1413793860;c=1586066867333)

这个错误很有迷惑性:
这个datanode节点决绝和主机通讯,因为主机的ip地址找不到.

然后我就挨头检查了本机和.41的hosts文件,发现都没有问题.最后,在这个帖子发现解决方法:

[https://blog.csdn.net/chanllen/article/details/45007027?_t_t_t=0.6160985444945513]

原来这个错误不是像刚才时那么理解,而是hadoop的安全机制在起作用,正确的理解方式是:
Hadoop集群为了保证安全,有这么一个机制,对于新加入的datanode,要从dns服务器中(不是hosts)查找这台机器的域名是不是存在,如果存在,允许加入,如果不存在,拒绝.而我的datanode配置namenode时,使用的就是域名.我的域名又没有备案,从公网DNS中肯定查不到,我又没有自己的DNS,当然查询不到,所以就拒绝.42和.43上的datanode加入集群.但是namenode进行这个检查时,没有从slaves中查找,也没有从hosts中查找,而是找的DNS,不明白是为什么
解决:
如上述博客中所属,在namenode的hdfs-site.xml 里面添加

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

即可

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值