最近要把一个运行在单机上的spark standalone cluster
(使用docker-compose编排的3master3worker)重构.采用在多个物理机上分角色部署,考虑到机器不够,准备使用pseudo cluster部署spark standalone cluster
角色
大概3台物理机,考虑到后续扩展,也可以后续增加更多物理节点
- 192.168.6.155
- 192.168.6.156
- 192.168.6.157
IP | 用途 |
---|---|
6.155 | zookeeper集群/zoo1 spark cluster/master1+worker1+worker4+history-server |
6.156 | zookeeper集群/zoo2 spark cluster/master2+worker2+worker5+history-server |
6.157 | zookeeper集群/zoo3 spark cluster/master3+worker3+worker6+history-server |
其他 | spark cluster/worker8+worker9+worker10 |
1、使用docker run
启动相应服务,镜像使用apache/spark:3.5.4-scala2.12-java11-python3-ubuntu
2、由于注册到worker跨机器了,所以采用--network host
直接使用宿主机网络,那么这样就需要躲避端口重复
3、由于可能不基于HDFS,那么需要考虑采用其他共享存储,比如Mounting S3 Bucket as a Filesystem in Linux
or NFS client
4、将必要存储挂载到宿主机,便于持久化,比如如下
$SPARK_HOME/work,对应变量为SPARK_WORKER_DIR
$SPARK_HOME/conf目录,
$SPARK_HOME/logs目录,
SPARK_LOCAL_DIRS,默认为/tmp,需要单独指定后,在从宿主机器挂载
$SPARK_HOME/jars目录,此目录为容器自带,如果需要增加some jars,则需要考虑单个挂载进去,
比如/somepath/jars/hadoop-aws-3.3.4.jar:/opt/spark/jars/hadoop-aws-3.3.4.jar
;
当然也可以将整改目录映射,这需要先将容器中原有到jars目录拷贝到宿主机器,然后再挂载回容器。
注意SPARK_JARS_DIR并不是用户可以自定义目录。
5、采用一个共享的maven repository用于第三方依赖管理,这个目录挂载给每个spark容器,执行一次mvn dependency:get -Dartifact=org.apache.kafka:kafka-clients:3.8.1
即可共享到每个容器中
6、容器apache/spark:3.5.4-scala2.12-java11-python3-ubuntu
到用户和group为185
spark@28f53bbc0338:/opt/spark$ id
uid=185(spark) gid=185(spark) groups=185(spark)
docker run \
-d \
--restart=always \
--network host \
--name=zknavigator \
--hostname=zknavigator \
-e HTTP_PORT=39000 \
elkozmon/zoonavigator:latest
端口
Spark 默认使用的主要端口如下:
端口号 | 用途说明 | 备注 |
---|---|---|
7077 | Spark Master 节点通信端口 | 用于客户端提交任务和Worker通信 |
8080 | Spark Master 的 Web UI 端口 | 用于访问Master网页界面 |
8081 | Spark Worker 的 Web UI 端口 | 用于访问Worker网页界面 |
4040 | Spark 应用程序的 Web UI 端口 | 每个应用启动时默认使用,若被占用依次递增 |
18080 | Spark History Server 的 Web UI端口 | 用于查看历史作业信息 |
6066 | Spark Master REST 服务端口 | 默认开启,但存在安全风险,建议关闭或修改 |
这些端口在Standalone模式下较为常用,端口号可以通过配置文件或环境变量修改,例如:
SPARK_MASTER_PORT
(默认7077)SPARK_MASTER_WEBUI_PORT
(默认8080)SPARK_WORKER_WEBUI_PORT
(默认8081)spark.ui.port
(默认4040)spark.history.ui.port
(默认18080)
如果需要修改端口,可以在spark-env.sh
或spark-defaults.conf
中配置对应参数,并重启服务生效。