解决Spark集群无法停止
执行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集群了。