以下所有操作都是在 Master 上。
- 停掉所有的 spark crontab 任务
stop crontab
sudo rm /etc/cron.d/crontab_ald_spark
- 杀掉所有的正在运行的 spark 进程
kill spark progress
ps aux | grep 'spark' | awk '{print $2}' | xargs kill -9
- 杀掉 Master(10.0.0.247)
stop-master.sh
spark/sbin/stop-master.sh -h 10.0.0.247 -p 7077
- 停掉所有的 slaves
stop-slaves.sh
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 的主机名:
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:
ssh VM-0-51-ubuntu
ssh VM-0-71-ubuntu
ssh VM-0-134-ubuntu
第一次免密码登陆会让你输入 YES 来确认, 以后就不用输入了。
集群的启动:
启动 master:
spark/sbin/start-master.sh -h 10.0.0.247 -p 7077
启动 slaves:
spark/sbin/start-slaves.sh -h 10.0.0.247 -p 7077
启动 slaves 后, 在 web ui 界面并没有发现 Alive 的 slaves, 登陆到 slave 查看:
ps aux | grep 'Worker'
发现:
/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
看到:
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 变量
export SPARK_MASTER_HOST=10.0.0.247
c) 自己在 spark 同级目录下创建一个 start-slaves.sh
文件, 文件中的内容如下:
#!/bin/bash
. ./conf.sh
spark/sbin/start-slaves.sh spark://$MASTER_HOST:7077
其中 conf.sh 的内容如下:
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