Standalone 模式下 Spark 集群的启动和停止

以下所有操作都是在 Master 上。

1) 停掉所有的 spark crontab 任务

stop crontab

1
sudo rm /etc/cron.d/crontab_ald_spark

2) 杀掉所有的正在运行的 spark 进程
kill spark progress

1
ps aux | grep 'spark' | awk '{print $2}' | xargs kill -9

3) 杀掉 Master(10.0.0.247)
stop-master.sh

1
spark/sbin/stop-master.sh -h 10.0.0.247 -p 7077

4) 停掉所有的 slaves
stop-slaves.sh

1
spark/sbin/stop-slaves.sh -h 10.0.0.247 -p 7077

停掉 slaves, 注意是 s, 需要先做 Master 到各 slave 的免密码登陆, 即把 Master 下的 ~/.ssh/id_rsa.pub 中的公钥复制到各 slave 下(用sudo su切换到root)的 ~/.ssh/authorized_keys 中。

在 Master 下的 /etc/hosts 文件中, 加上各 slave 的主机名:

1
2
3
4
127.0.0.1  localhost  localhost.localdomain  VM-0-247-ubuntu
10.0.0.51 VM-0-51-ubuntu
10.0.0.71 VM-0-71-ubuntu
10.0.0.134 VM-0-134-ubuntu

然后手动登陆各个 slave:

1
2
3
ssh VM-0-51-ubuntu
ssh VM-0-71-ubuntu
ssh VM-0-134-ubuntu

第一次免密码登陆会让你输入 YES 来确认, 以后就不用输入了。


集群的启动:

启动 master:

1
spark/sbin/start-master.sh -h 10.0.0.247 -p 7077

启动 slaves:

1
spark/sbin/start-slaves.sh -h 10.0.0.247 -p 7077

启动 slaves 后, 在 web ui 界面并没有发现 Alive 的 slaves, 登陆到 slave 查看:

1
ps aux | grep 'Worker'

发现:

1
/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java -cp /data/app/ald_spark/spark/conf/:/data/app/ald_spark/spark/jars/* -Xmx2g -XX:MaxPermSize=256m org.apache.spark.deploy.worker.Worker --webui-port 8081 spark://localhost:7077

发现 Worker 连接 localhost 作为 Master 了。vim spark/sbin/start-slaves.sh 看到:

1
2
3
4
5
6
7
8
9
10
if [ "$SPARK_MASTER_HOST" = "" ]; then
case `uname` in
(SunOS)
SPARK_MASTER_HOST="`/usr/sbin/check-hostname | awk '{print $NF}'`"
;;
(*)
SPARK_MASTER_HOST="`hostname -f`"
;;
esac
fi

我们是 ubuntu 系统, 运行 hostname -f 得到 localhost, 所以 slave 自然连接到的也是 localhost。

有几种解决办法:
a) 直接在上面的代码中把 SPARK_MASTER_HOST 改为 10.0.0.247
b) 在 ~/.bashrc~/.profile 文件中加入 SPARK_MASTER_HOST 变量

1
export SPARK_MASTER_HOST=10.0.0.247

c) 自己在 spark 同级目录下创建一个 start-slaves.sh 文件, 文件中的内容如下:

1
2
3
#!/bin/bash
. ./conf.sh
spark/sbin/start-slaves.sh spark://$MASTER_HOST:7077

其中 conf.sh 的内容如下:

1
2
3
4
5
6
7
MASTER_HOST=10.0.0.247

if [ "$ALD_ENV"x = "test"x ]; then
MASTER_HOST=127.0.0.1;
fi

echo "MASTER_HOST=$MASTER_HOST"

然后运行 ./start-slaves.sh 即可。

Standalone 模式下任务是 FIFO, first in, first out, 正在运行的任务会尽可能的使用所有可用资源(cpu/内存), 后面的任务需要等到前面的任务执行完才开始, 如果任务过于密集, 会造成排队现象, 某些任务会 Waitng