解決Spark叢集無法停止

右介發表於2018-01-18

執行stop-all.sh時,出現報錯:no org.apache.spark.deploy.master.Master to stop,no org.apache.spark.deploy.worker.Worker to stop

 

原因:

Spark的停止,是通過一些.pid檔案來操作的。

檢視spark-daemon.sh檔案,其中一行:$SPARK_PID_DIR  The pid files are strored .  /tmp by default .

$SPARK_PID_DIR存放的pid檔案中,就是要停止的程式的pid,其中$SPARK_PID_DIR預設是在系統的/tmp目錄。

系統每隔一段時間就會清除/tmp目錄下的內容。到/tmp下檢視,如果沒有Spark相關.pid檔案,這就是導致Spark叢集無法停止的原因。

 

解決:

檢視spark-daemon.sh檔案中.pid檔案命名規則,其中一行:pid=$SPARK_PID_DIR/spark-$SPARK_IDENT_STRING-$command-$instance.pid

其中

$SPARK_PID_DIR是/tmp

$SPARK_IDENT_STRING是登入使用者$USER,我的使用者名稱是root

$command是呼叫spark-daemon.sh時的引數,有兩個:

org.apache.spark.deploy.master.Master

org.apache.spark.deploy.worker.Worker

$instance也是呼叫spark-daemon.sh時的引數

 

因此pid檔名如下:

spark-cdahdp-org.apache.spark.deploy.master.Master-1.pid(在master機器中/tmp下建立)

spark-cdahdp-org.apache.spark.deploy.worker.Worker-1.pid(在每一臺worker機器中/tmp下建立,如果一臺機器開啟了多個worker,就建立多個.pid檔案,檔名最後的數字依次遞增)

通過jps檢視所有機器相關程式(master、worker)的pid數字。編輯所有.pid檔案,把pid數字一一對應寫入.pid檔案,最後每個.pid檔案中都是一個程式號。

然後執行spark的stop-all.sh,即可正常停止spark叢集。

 

徹底解決:

在叢集所有節點編輯spark-env.sh,增加一行:export SPARK_PID_DIR=/home/ap/root/app/pids

刪除之前自己建立的所有.pid檔案。

然後可以啟動spark叢集了。

 

相關文章