記一次關閉Hadoop時no namenode to stop異常

記一次關閉Hadoop時no namenode to stop異常

​ 在自己的虛擬機環境上跑着hadoop集羣,一直正常運行着,不用的時候直接掛起虛擬機,今天需要做些調整,但是發現集羣突然無法正常關閉了。遂祭出百度大法~:

大家都知道,關閉集羣的命令是stop-dfs.shstop-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

大功告成,重啓集羣即可~

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