在 上一篇文章, 我们构建了 Spark 的基础镜像,在本文中,我们借助于基础镜像来构建 Spark 的 standalone 集群。
集群组成
在本次演示中要建立的集群包含一台 spark master 和 三台 spark worker。 部署在 docker 虚拟网络中,网段为 10.5.0.0/16。 每个 spark 实例有自己的 ip 地址。并通过和本机(host)的端口映射暴露自己,提供给外部进行访问。
建立 master 镜像
我们以上文中构建的 spark-base:2.3.1 为基础来构建 spark-master 镜像。主要增加的是执行启动 master 的命令。 如下:
1 2 3 4 5 6 7 8 9 10 11
| FROM spark-base:2.3.1
COPY start-master.sh /
ENV SPARK_MASTER_PORT 7077 ENV SPARK_MASTER_WEBUI_PORT 8080 ENV SPARK_MASTER_LOG /spark/logs
EXPOSE 8080 7077 6066
CMD ["/bin/bash", "/start-master.sh"]
|
以上是 Dockerfile 文件, 为启动 master, 我们新增了一个名为 start-master.sh Shell文件, 内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #!/bin/bash
export SPARK_MASTER_HOST=`hostname`
export SPARK_HOME=/tmp/spark
$SPARK_HOME/sbin/spark-config.sh
$SPARK_HOME/bin/load-spark-env.sh
mkdir -p $SPARK_MASTER_LOG
ln -sf /dev/stdout $SPARK_MASTER_LOG/spark-master.out
cd $SPARK_HOME/bin && $SPARK_HOME/sbin/../bin/spark-class org.apache.spark.deploy.master.Master --ip $SPARK_MASTER_HOST --port $SPARK_MASTER_PORT --webui-port $SPARK_MASTER_WEBUI_PORT >> $SPARK_MASTER_LOG/spark-master.out
|
保存以上两个文件在同一目录中,然后执行以下命令构建镜像:
1
| docker build -t="spark-master:2.3.1" .
|
建立 worker 镜像
在 spark-base:2.3.1 镜像的基础上, 增加执行启动 worker 节点的命令。 如下:
1 2 3 4 5 6 7 8 9 10 11
| FROM spark-base:2.3.1
COPY start-worker.sh /
ENV SPARK_WORKER_WEBUI_PORT 8081 ENV SPARK_WORKER_LOG /spark/logs ENV SPARK_MASTER "spark://spark-master:7077"
EXPOSE 8081
CMD ["/bin/bash", "/start-worker.sh"]
|
以上是 Dockerfile 文件, 为启动 worker, 我们新增了一个名为 start-worker.sh Shell文件, 内容如下:
1 2 3 4 5 6 7 8 9 10 11 12
| #!/bin/bash
. "/spark/sbin/spark-config.sh" . "/spark/bin/load-spark-env.sh"
mkdir -p $SPARK_WORKER_LOG
export SPARK_HOME=/tmp/spark
ln -sf /dev/stdout $SPARK_WORKER_LOG/spark-worker.out
$SPARK_HOME/sbin/../bin/spark-class org.apache.spark.deploy.worker.Worker --webui-port $SPARK_WORKER_WEBUI_PORT $SPARK_MASTER >> $SPARK_WORKER_LOG/spark-worker.out
|
保存以上两个文件在同一目录中,然后执行以下命令构建镜像:
1
| docker build -t="spark-worker:2.3.1" .
|
使用 docker-compose 编排容器
建立一个名为: docker-compose.yml 的文件,包含以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| version: "3.7" services: spark-master: image: spark-master:2.3.1 container_name: spark-master hostname: spark-master ports: - "8080:8080" - "7077:7077" networks: spark-network: ipv4_address: 10.5.0.2 environment: - "SPARK_LOCAL_IP=spark-master" spark-worker-1: image: spark-worker:2.3.1 container_name: spark-worker-1 hostname: spark-worker-1 depends_on: - spark-master ports: - "8081:8081" env_file: ./spark-worker-env.sh environment: - "SPARK_LOCAL_IP=spark-worker-1" networks: spark-network: ipv4_address: 10.5.0.3 spark-worker-2: image: spark-worker:2.3.1 container_name: spark-worker-2 hostname: spark-worker-2 depends_on: - spark-master ports: - "8082:8081" env_file: ./spark-worker-env.sh environment: - "SPARK_LOCAL_IP=spark-worker-2" networks: spark-network: ipv4_address: 10.5.0.4 spark-worker-3: image: spark-worker:2.3.1 container_name: spark-worker-3 hostname: spark-worker-3 depends_on: - spark-master ports: - "8083:8081" env_file: ./spark-worker-env.sh environment: - "SPARK_LOCAL_IP=spark-worker-3" networks: spark-network: ipv4_address: 10.5.0.5 networks: spark-network: driver: bridge ipam: driver: default config: - subnet: 10.5.0.0/16
|
可用看到,编排了一个 master 和 三个 worker 容器实例。 为设置 worker 的运行参数又引入了一个名为 spark-worker-env.sh 的文件,内容如下:
1 2 3 4 5 6 7
| SPARK_MASTER=spark://spark-master:7077
SPARK_WORKER_CORES=1 SPARK_WORKER_MEMORY=1G SPARK_DRIVER_MEMORY=128m SPARK_EXECUTOR_MEMORY=256m
|
可用看到,通过环境变量 SPARK_MASTER, 指明了 master 的地址和端口,因为实在 docker 的虚拟网络中,因此可用直接使用容器实例名作为 host 的名字。
保存以上两个文件在同一命令里,然后在中执行以下命令启动集群:
可用看到系统提示4个容器被建立,类似下面的系统输出:
1 2 3 4 5
| Creating network "spark-standalone-cluster" with driver "bridge" Creating spark-master ... done Creating spark-worker-2 ... done Creating spark-worker-3 ... done Creating spark-worker-1 ... done
|
通过 docker ps 命令,也可用看到这是个启动的容器
1 2 3 4 5
| CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c277a128de6f spark-worker:2.3.1 "/bin/bash /start-wo…" 5 seconds ago Up 3 seconds 0.0.0.0:8081->8081/tcp spark-worker-1 d1c4f89d83e4 spark-worker:2.3.1 "/bin/bash /start-wo…" 5 seconds ago Up 3 seconds 0.0.0.0:8083->8081/tcp spark-worker-3 aa6936175ec7 spark-worker:2.3.1 "/bin/bash /start-wo…" 5 seconds ago Up 3 seconds 0.0.0.0:8082->8081/tcp spark-worker-2 c186182938bd spark-master:2.3.1 "/bin/bash /start-ma…" 5 seconds ago Up 4 seconds 0.0.0.0:7077->7077/tcp, 6066/tcp, 0.0.0.0:8080->8080/tcp spark-master
|
接下来,就可用通过浏览器访问本机的 8080 端口
就可用看到 master 和整个集群中节点的信息了。
注意: 以上配置只适合于开发环境,要用在正式环境,需要进一步的配置,比如把数据,应用的存储从容器中映射的 Host 的存储或是分布式存储 HDFS 中