分类
devops

setup spark standalone pseudo cluster

Table of Contents

最近要把一个运行在单机上的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.shspark-defaults.conf中配置对应参数,并重启服务生效。

ref