描述:在hadoop 運行start-all.sh,發現缺少了NameNode, 缺少ResourceManager, 缺少NodeManager…等等的服務。這類問題有統一的解決方案。即查閱hadoop日志。
目錄
1.hadoop日志
hadoop日志位於 hadoop 安裝目錄下的logs里,包含了start-all.sh
命令中沒有顯示的重要信息,如果有報錯,信息也可以在以下文件中找到。
由於我測試了兩個host,所以在文件夾里會有兩種日志,即以localhost.localdomain.log
為結尾的,和以mainnode.log
的
2.1沒有NameNode
一般來說沒有node是由於沒有找到是由於忘記格式化namenode,我們輸入
[root@mainnode logs]# vim hadoop-root-namenode-mainnode.log +
可以查看logs日志找到如下提示。
Directory /opt/hadoop-3.2.1/tmp/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.
在這句話中 /opt/hadoop-3.2.1/tmp/dfs/name
是由格式化namenode產生的,所以就意味着我們沒有初始化namenode。需要我們先執行如下命令
hdfs namenode -format
然后再次嘗試start-all.sh
2.2沒有ResourceManager和NodeManager
了解了日志之后,我們來試試使用日志來解決這個問題
vim hadoop-root-resourcemanager-localhost.localdomain.log
輸入上面的命令,我們可以在resourcemanager的日志里看到如下提示,原來是缺少了一個類。
出現這個問題,一般來說是由於jdk版本過引起,建議使用1.7和1.8兩個版本。如果你不想跟換jdk,也可以直接下載activation-1.1.1.jar到lib目錄下,或者本地上傳到${HADOOP_HOME}/share/hadoop/yarn/lib目錄下后重新啟動start-yarn.sh即可:
cd ${HADOOP_HOME}/share/hadoop/yarn/lib
wget https://repo1.maven.org/maven2/javax/activation/activation/1.1.1/activation-1.1.1.jar
然后再次嘗試start-all.sh
2.3沒有ResourceManager
了解了日志之后,我們來試試使用日志來解決這個問題
vim hadoop-root-resourcemanager-localhost.localdomain.log
輸入上面的命令,我們可以在resourcemanager的日志里看到如下提示,原來是端口被占用了,我們只需要更改以下ResourceManager的端口就好
Address already in use; For more details see: http://wiki.apache.org/hadoop/BindException
vim hadoop-root-resourcemanager-localhost.localdomain.log
進入yarn-site.xml 在configuration 添加如下的屬性更改一個沒有被使用端口即可
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoop:8888</value> <!-- hadoop要改為你的ip地址或hosts -->
</property>
然后再次嘗試start-all.sh
總結
面對這類hadoop啟動缺少缺少進程沒有提示的問題,我們需要先查閱logs找到更加精確問題原因,通過這些錯誤原因我們就很容易找到解決方案了。
祝大家hadoop之旅愉快。