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>

即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章