閱讀319 返回首頁    go 阿裏雲 go 技術社區[雲棲]


誤刪/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

  上一篇:go 軟件開發之路全程記錄
  下一篇:go 扯淡的網事周刊