1. 程式人生 > >spark,hadoop,hbase叢集無法停止的問題

spark,hadoop,hbase叢集無法停止的問題

        長時間執行叢集之後,如何需要停止叢集使用stop相關命令時常常會都提示no datanode,no namenode等等之類的資訊,檢視相關stop-all.sh stop-dfs.sh,stop-yarn.sh指令碼,發現原理都是通過一個pid檔案來停止叢集的。這些程序的pid檔案預設都是儲存在系統的/tmp目錄下面,系統每個一段時間就會清楚/tmp下面的內容,於是我ls /tmp看了一下,果然沒有相關程序的pid檔案了。才導致了stop-all.sh無法停止叢集的原因。
        如果強制kill -9殺程序的話會破壞叢集,可以按照pid檔案的命名規則重新在/tmp目錄下面建立這些pid檔案,在翻看了一堆sbin目錄下的指令碼之後,找到了它們的命名規則。

比如hadoop相關程序的pid檔案命名規則為:pid=$HADOOP_PID_DIR/hadoop-$HADOOP_IDENT_STRING-$command.pid
yarn相關程序的pid檔案規則:pid=$YARN_PID_DIR/yarn-$YARN_IDENT_STRING-$command.pid

預設情況下$HADOOP_PID_DIR和$YARN_PID_DIR都為/tmp,$HADOOP_IDENT_STRING和$YARN_IDENT_STRING都為當前系統登入的使用者名稱,比如我的使用者名稱為hadoop,$command為當前執行的命令
比如執行了一個 hadoop-daemon.sh stop namenode,這時候就會去找/tmp/hadoop-hadoop-namenode.pid檔案拿到namenode程序的pid號,來停止namenode程序。

瞭解原理之後,於是我就開始手動建立這些檔案,我首先jps把所有程序的pid都記錄下來了,然後在/tmp目錄按照命名規則建立好了這些程序的pid檔案,然後再重新執行stop-all.sh命令,ok可以成功關閉叢集了。


但這不是一個長久之計,因為下次pid檔案還是儲存在/tmp目錄下,還是會出這個問題,所以要徹底解決這個問題,就是不使用預設的/tmp資料夾來存放pid檔案。
按以下步驟:
1 在叢集各個節點的/var目錄下面建立一個資料夾: sudo mkdir -p /XXX/pids,(XXX指自己指定目錄)記得更改這個資料夾的許可權,chown -R hadoop:hadoop /var/hadoop,將這個目錄及子目錄的擁有者改為你的當前使用者,我這是hadoop,不然執行start-all.sh的時候當前使用者會沒有許可權建立pid檔案

2 修改hadoop-env.sh 將原有修改為:export HADOOP_PID_DIR=/XXX/pids
3 修改yarn-env.sh 增加:export YARN_PID_DIR=/XXX/pids
4 修改hbase-env.sh ,放開原有註釋:export HBASE_PID_DIR=/XXXp/pids
修改spark-env.sh,增加:export SPARK_PID_DIR=/XXX/pids

重新執行 start-all.sh,start-hbase.sh把hadoop叢集和hbase叢集啟動起來,然後我們ls /XXX/pids檢視一下pid檔案是否生成在裡面了,果然出現在了裡面

master上pid檔案

hadoop-hadoop-namenode.pid           hbase-hadoop-master.pid    spark-hadoop-org.apache.spark.deploy.master.Master-1.pid
hadoop-hadoop-secondarynamenode.pid  yarn-hadoop-resourcemanager.pid 

slaves上pid:

hadoop-hadoop-datanode.pid     yarn-hadoop-nodemanager.pid     spark-hadoop-org.apache.spark.deploy.worker.Worker-1.pid
hbase-hadoop-regionserver.pid
然後我們再執行stop-hbase.sh和stop-all.sh命令來測試一下看看能不能正常停止hbase叢集和hadoop叢集,結果是肯定的。說明配置是有效的。
至此,這個問題已經完美的解決了。
最後注意一點就是,不僅僅是修改master的所有env檔案,叢集中的所有節點的這些檔案都要修改!