誤刪/tmp導致hadoop無法啟停, jps無法查看的解決方法
問題描述
我的hadoop版本是hadoop-cdh4.2.0,由於誤刪了/tmp目錄(不是hadoop.tmp.dir設定的那個目錄),在Namenode,SecondaryNamenode和Datanode上使用jps無法查看到如下結果:
[root@desktop1 ~]# jps 5389 NameNode 5980 Jps 5710 ResourceManager 7032 JobHistoryServer [root@desktop2 ~]# jps 3187 Jps 3124 SecondaryNameNode [root@desktop3 ~]# jps 3187 Jps 3124 DataNode 5711 NodeManager同時,在namenode上,啟停dfs和yarn都無效,顯示 no namenode to stop, no datanode to stop 等等。而整個hadoop集群是正常運轉的。
排查原因
jps查看起的進程需要讀取/tmp目錄下的一些內容。另一方麵,在啟停hadoop的腳本裏,比如
sbin/stop-yarn.sh實際使用的是
sbin/yarn-deamon.sh該腳本描述裏寫道:
# Runs a yarn command as a daemon. # # Environment Variables # # YARN_CONF_DIR Alternate conf dir. Default is ${YARN_HOME}/conf. # YARN_LOG_DIR Where log files are stored. PWD by default. # YARN_MASTER host:path where hadoop code should be rsync'd from # YARN_PID_DIR The pid files are stored. /tmp by default. # YARN_IDENT_STRING A string representing this instance of hadoop. $USER by default # YARN_NICENESS The scheduling priority for daemons. Defaults to 0.根據 YARN_PID_DIR The pid files are stored. /tmp by default. /tmp目錄保存的是pid的進程號,集群無法啟停,jps無法查看進程都是因為丟失了pid,或者與/tmp下當前的pid進程號對不上,我的解決方法就是查看各節點上的進程然後替換pid文件裏的內容,實施後證明是可行的
解決方案
使用netstat查看pid進程號,
ps -ef | grep datanode | grep -v grep
namenode查看namenode和resourcemanager,/tmp下文件為hadoop-root-namenode.pid和 yarn-root-resourcemanager.pid
secondarynamenode查看secondarynamenode,/tmp下文件為hadoop-root-secondarynamenode.pid
datanode查看datanode和nodemanager,/tmp下文件為hadoop-root-datanode.pid和yarn-root-nodemanager.pid
(以上root為user名字)
下麵是我使用的替換datanode機器上的pid的一個腳本,可以參考使用
> /tmp/hadoop-root-datanode.pid && echo `ps -ef | grep datanode | grep -v grep | awk '{print $2}'` > /tmp/hadoop-root-datanode.pid > /tmp/yarn-root-nodemanager.pid && echo `ps -ef | grep nodemanager | grep -v grep | awk '{print $2}'` > /tmp/yarn-root-nodemanager.pid所有機器上都更新好pid文件後,就可以去namenode上啟停集群了,jsp命令也生效了。
(全文完)
最後更新:2017-04-03 14:53:43