在 Docker 中配置 Spark 集群(二)

上一篇文章, 我们构建了 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 的名字。

保存以上两个文件在同一命令里,然后在中执行以下命令启动集群:

1
docker-compose up -d

可用看到系统提示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 端口

1
http://localhost:8080

就可用看到 master 和整个集群中节点的信息了。

注意: 以上配置只适合于开发环境,要用在正式环境,需要进一步的配置,比如把数据,应用的存储从容器中映射的 Host 的存储或是分布式存储 HDFS 中

本文标题:在 Docker 中配置 Spark 集群(二)

文章作者:晨星

发布时间:2020年11月30日 - 16:11

最后更新:2021年04月16日 - 15:04

原始链接:https://www.mls-tech.info/spark/spark-cluster-on-docker-2/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。