記一次關閉Hadoop時no namenode to stop異常
在自己的虛擬機環境上跑着hadoop集羣,一直正常運行着,不用的時候直接掛起虛擬機,今天需要做些調整,但是發現集羣突然無法正常關閉了。遂祭出百度大法~:
大家都知道,關閉集羣的命令是stop-dfs.sh
和stop-yarn.sh
,然鵝我執行完具體情況是這樣的:
[simon@master ~]# stop-dfs.sh
Stopping namenodes on [master]
master: no namenode to stop
slave2: no datanode to stop
slave1: no datanode to stop
...
啊啊啊...這都是啥...俺有些不懂...
可以正常啓動卻不能停止?kiding me ?
執行jps
命令,發現namenode,datanode等進程都正常運行着。納了悶!
最終參考大佬們的博客之後, 開始閱讀hadoop-daemon.sh腳本文件,然後找出問題了問題的原因。
1、首先確定,報錯代碼出現的位置:
if [ -f $pid ]; then
TARGET_PID=`cat $pid`
if kill -0 $TARGET_PID > /dev/null 2>&1; then
echo stopping $command
kill $TARGET_PID
sleep $HADOOP_STOP_TIMEOUT
if kill -0 $TARGET_PID > /dev/null 2>&1; then
echo "$command did not stop gracefully after $HADOOP_STOP_TIMEOUT seconds: killing with kill -9"
kill -9 $TARGET_PID
fi
else
echo no $command to stop
fi
rm -f $pid
else
echo no $command to stop
fi
沒錯了,報錯代碼就是後邊幾行
....省略
else
echo no $command to stop
fi
現在原因很明顯,如果找不到pid文件,在停止集羣的時候就會報出這個錯誤。那麼什麼是pid文件呢?爲什麼找不到呢?
2、經過查閱資料發現,在腳本中有這麼一行代碼
#第107行
pid=$HADOOP_PID_DIR/hadoop-$HADOOP_IDENT_STRING-$command.pid
這裏可以看出,
HADOOP_PID_DIR
變量指定了hadoop的pid文件的存放目錄。那麼這個pid文件是啥呢。Hadoop啓動後,會把進程的PID號存儲在一個文件中,這樣執行stop-dfs腳本時就可以按照進程PID去關閉進程了。
找到
HADOOP_PID_DIR
默認的路徑 :if [ "$HADOOP_PID_DIR" = "" ]; then #97~99行 HADOOP_PID_DIR=/tmp fi
ok, 明白了,存放集羣pid文件的目錄就是系統的
/tmp
目錄,而這個目錄下的文件系統會定期清理的。我這個集羣自從搭建起來,一直運行着,pid文件也早就被清空了。所以我們給它換個指定目錄,可以自己定義。我就把它設爲了/home/tmp/pid
。
3. 着手設置
既然stop
命令無法使用,那我們只能手動關閉了,jps
查看你的namenode\datanode等進程的PID,然後用kill -9幹掉即可。
if [ "$HADOOP_PID_DIR" = "" ]; then #97~99行
HADOOP_PID_DIR=/home/tmp/pid # 創建這個文件夾用於存放pid文件
fi
大功告成,重啓集羣即可~