長時間運行Hadoop以後,若是運行 stop-dfs.sh(或stop-all.sh),會發現有如下相似錯誤:node
Stopping namenodes on [localhost]
localhost: no namenode to stop
localhost: no datanode to stop
Stopping secondary namenodes [localhost]
localhost: no secondarynamenode to stopoop
這個時候訪問hadoop依然有效,查看文件系統,經過50070端口依然能訪問,start-all後再stop-all也沒有任何效果,等於這個時候徹底沒法控制hadoop了。spa
出現這個問題的最多見緣由是:hadoop在stop的時候依據的是datanode上的mapred和dfs進程號。而默認的進程號保存在/tmp下,Linux默認會每隔一段時間(通常是一個月或者7天左右)去刪除這個目錄下的文件。所以刪掉 hadoop-root-namenode.pid, hadoop-root-namenode.pid, hadoop-root-secondarynamenode.pid等pid文件後,namenode天然就找不到datanode上的這兩個進程了。進程
另外還有兩個緣由可能引發這個問題:hadoop
解決方法:變量
永久解決方法:修改 $HADOOP_HOME/etc/hadoop/hadoop-env.sh 文件,將 export HADOOP_PID_DIR=${HADOOP_PID_DIR} 的 ${HADOOP_PID_DIR} 路徑修改成你本身指定目錄,這樣Hadoop會把相關pid進程文件保存在指定目錄,避免被Linux自動刪除。例如:map
export HADOOP_PID_DIR=/usr/local/hadoop/pids/grep
發現問題後的解決方法:方法
這個時候經過腳本已經沒法中止進程了,不過咱們能夠手工中止,經過 ps -ef | grep Java | grep hadoop找到hadoop的全部進程號強制殺掉(kill -9 進程號),而後再執行 start-dfs.sh, start-yarn.sh 等命令啓動hadoop,之後 stop-dfs.sh 等命令就不會生效了。腳本