執行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叢集了。