Spark使用经验 docker部署篇
Posted
一、 理解Spark的Spark Standalone网络架构
如上图所示,Spark的Spark Standalone集群主要是由Master,Worker,Executor,Driver这4个角色组成。
Master节点会打开3个端口:
- 8080为Web UI端口,用来看集群的整体情况;
- 7077为Master的数据端口,用来接收Driver提交的任务和与worker进行数据交互;
- 6066为Master的REST API端口。
Worker节点和Executor在同一台机器,所以也需要打开3个端口:
- 8081为Web UI端口,用来看Worker自身的情况;
- 随机侦听一个端口(也可以手工指派),用于与Master进行通信;
- Executor创建时随机打开一个端口,用于与Driver进行Block管理交换信息。
Driver需要打开3个端口:
- 4040为Web UI端口,用来看Driver自身的情况;
- 随机侦听一个端口(也可以手工指派),用于与Executor进行Block管理交换信息;
- 随机侦听一个端口(也可以手工指派),用于与Executor进行信息交换;
二、通过Docker部署Spark Standalone集群
根据上述的4个角色的网络架构,在创建容器时要指定和打开相应的端口才能使集群正常工作。具体操作如下:
拉取spark的镜像
- 建议使用欧洲大数据社区制作的spark影像
master镜像:
docker pull dockerhub.azk8s.cn/bde2020/spark-master:2.4.4-hadoop2.7
worker镜像:
docker pull dockerhub.azk8s.cn/bde2020/spark-worker:2.4.4-hadoop2.7
启动Master(后3个端口是为Driver预留的)
docker run --name spark-master -h spark-master -e ENABLE_INIT_DAEMON=false -p 6066:6066 -p 7077:7077 -p 8080:8080 -p 4040:4040 -p 30000:30000 -p 40000:40000 -d dockerhub.azk8s.cn/bde2020/spark-master:2.4.4-hadoop2.7
启动Worker
docker run --net host --name spark-worker-1 -e SPARK_MASTER="spark://192.168.0.1:7077" -e SPARK_PUBLIC_DNS="192.168.0.2" -e SPARK_LOCAL_IP="192.168.0.2" -e SPARK_WORKER_PORT="34000" -p 34000:34000 -p 8081:8081 -e ENABLE_INIT_DAEMON=false -d dockerhub.azk8s.cn/bde2020/spark-worker:2.4.4-hadoop2.7
- SPARK_MASTER环境变量为Master的地址
- SPARK_PUBLIC_DNS为Web UI上引用的地址
- SPARK_LOCAL_IP为Spark绑定的地址
- 关键参数为
--net host
,因为在容器中worker无法绑定宿主的IP,所以必须使用host网络才能正常启动worker - 完成后可以通过Master的Web UI查看Worker是否注册成功。
启动spark-shell
docker exec -it spark-master /spark/bin/spark-shell --jars /spark/mysql.jar --driver-class-path /spark/mysql.jar --conf spark.driver.host=192.168.0.1 --conf spark.driver.bindAddress=0.0.0.0 --conf spark.driver.port=30000 --conf spark.driver.blockManager.port=40000 --master spark://192.168.0.1:7077 --executor-memory 4G --executor-cores 10
- 由于Master的镜像中已经包含spark-shell,因此可以通过docker exec来运行spark-shell
- 必须指定
--master
参数,Driver才会进入集群模式,否则就是单机模式。 - 必要时可以指定
--executor-cores
和--executor-memory
来限制使用多少个核和多少内存。
总结
经过上述步骤,可以轻松部署到一个Spark Standalone集群。如果需要增加Worker,只需要在另外的机器上重复Worker的部署命令即可。