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