在 Docker 中配置 Spark 集群(一)

本系列演示如何使用 Docker 搭建 Spark Cluster。

在本系列的第一部分,我们首先搭建一个包含 Scala, Python, SBT 和 Spark 的基础镜像,为后续的集群搭建打下基础。

所使用到的软件版本分别为:

Java: 1.8
Scala: 2.13.4
Python: 3
Spark: 2.4.7

基于网络的Dockerfile

为构建基础镜像,我们使用如下的 Dockerfile

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
FROM java:8-jdk-alpine

ENV DAEMON_RUN=true
ENV SPARK_VERSION=2.4.7
ENV HADOOP_VERSION=2.7
ENV SCALA_VERSION=2.13.4
ENV SCALA_HOME=/usr/share/scala

RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.8/main/" > /etc/apk/repositories

RUN apk update && apk upgrade

RUN apk add --no-cache --virtual=.build-dependencies wget ca-certificates && \
apk add --no-cache bash curl jq && \
cd "/tmp" && \
wget --no-verbose "https://downloads.lightbend.com/scala/${SCALA_VERSION}/scala-${SCALA_VERSION}.tgz" && \
tar xzf "scala-${SCALA_VERSION}.tgz" && \
mkdir "${SCALA_HOME}" && \
rm "/tmp/scala-${SCALA_VERSION}/bin/"*.bat && \
mv "/tmp/scala-${SCALA_VERSION}/bin" "/tmp/scala-${SCALA_VERSION}/lib" "${SCALA_HOME}" && \
ln -s "${SCALA_HOME}/bin/"* "/usr/bin/" && \
apk del .build-dependencies && \
rm -rf "/tmp/"*

#Scala instalation
RUN export PATH="/usr/local/sbt/bin:$PATH" && \
apk update && apk add ca-certificates wget tar && \
mkdir -p "/usr/local/sbt" && \
wget -qO - --no-check-certificate "https://github.com/sbt/sbt/releases/download/v1.4.4/sbt-1.4.4.tgz" | tar xz -C /usr/local/sbt --strip-components=1 && \
sbt sbtVersion -Dsbt.rootdir=true

RUN apk add --no-cache python3

RUN wget --no-verbose https://apache.inspire.net.nz/spark/spark-${SPARK_VERSION}/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz && tar -xvzf spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz \
&& mv spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION} spark \
&& rm spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz

该文件指定使用 Alpine Linux 官方的 JDK 8 镜像作为基础,通过在构建镜像时直接从网络下载 (使用 wget )相关的软件包来进行构建。

保存文件后,执行以下命令进行构建(假设以上的内容保存在名为 base-spark 的文件中)

1
docker build -t="spark-base:2.3.1" -f base-spark .

基于本地文件的 Dockerfile

如果下载 scala, sbt 或 spark 时比较慢,或者是有些完全无法下载,可以先从别的渠道把这三个软件的压缩包下载好,再修改 Dockerfile 中的部分内容来完成构建。

为方便下载以上三个软件有困难的读者,笔者已经将相关压缩包发在百度盘中,可以凭下面的信息进行存取。

1
2
链接:https://pan.baidu.com/s/1mIEuRx9DmB_UNReUId6iqg 
提取码:1j9u

下载以后,把三个压缩包和 Dockerfile 放在同一目录下。然后修改 Dockerfile 文件如下:

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
FROM java:8-jdk-alpine

ENV DAEMON_RUN=true
ENV SPARK_VERSION=2.4.7
ENV HADOOP_VERSION=2.7
ENV SCALA_VERSION=2.13.4
ENV SCALA_HOME=/usr/share/scala

RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.8/main/" > /etc/apk/repositories

RUN apk update && apk upgrade

RUN apk add --no-cache --virtual=.build-dependencies wget ca-certificates && \
apk add --no-cache bash curl jq

WORKDIR "/tmp"

COPY scala-${SCALA_VERSION}.tgz /tmp/scala-${SCALA_VERSION}.tgz

RUN tar xzf "scala-${SCALA_VERSION}.tgz" && \
mkdir "${SCALA_HOME}" && \
rm "/tmp/scala-${SCALA_VERSION}/bin/"*.bat && \
mv "/tmp/scala-${SCALA_VERSION}/bin" "/tmp/scala-${SCALA_VERSION}/lib" "${SCALA_HOME}" && \
ln -s "${SCALA_HOME}/bin/"* "/usr/bin/" && \
apk del .build-dependencies && \
rm -rf "/tmp/"*

#Scala instalation

RUN export PATH="/usr/local/sbt/bin:$PATH" && \
apk update && apk add ca-certificates wget tar && \
mkdir -p "/usr/local/sbt"

COPY sbt-1.4.4.tgz /tmp/sbt-1.4.4.tgz

RUN tar xzf sbt-1.4.4.tgz -C /usr/local/sbt --strip-components=1 && \
/usr/local/sbt/bin/sbt sbtVersion -Dsbt.rootdir=true

RUN apk add --no-cache python3

COPY spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz /tmp/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz

RUN tar -xvzf spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz \
&& mv spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION} spark \
&& rm spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz

保存文件后,执行以下命令进行构建(假设以上的内容保存在名为 base-spark 的文件中)

1
docker build -t="spark-base:2.3.1" -f base-spark .

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

文章作者:晨星

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

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

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

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