Spark使用经验 docker部署篇

一、 理解Spark的Spark Standalone网络架构

如上图所示,Spark的Spark Standalone集群主要是由Master,Worker,Executor,Driver这4个角色组成。

Master节点会打开3个端口:

Worker节点和Executor在同一台机器,所以也需要打开3个端口:

Driver需要打开3个端口:

二、通过Docker部署Spark Standalone集群

根据上述的4个角色的网络架构,在创建容器时要指定和打开相应的端口才能使集群正常工作。具体操作如下:

  1. 拉取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
      
  2. 启动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
    
  3. 启动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是否注册成功。
  4. 启动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的部署命令即可。

参考文献