利用dockerfile构建spark镜像

目的

需要构建一个开箱即可用的spark集群镜像,便于做一些实验性的测试验证程序

镜像树(我自己的叫法)

1
2
3
java:8jre
|__spark131-jre8 # jre8 + spark1.3.1
|__ spark131-jre8-all # spark131-jre8 + 启动一个master和一个slave节点, spark集群为standalone模式

Dockerfile

spark131-jre8

1
2
3
4
5
6
FROM java:8-jre
MAINTAINER Louz
RUN curl -s http://d3kbcqa49mib13.cloudfront.net/spark-1.3.1-bin-hadoop2.6.tgz | tar -xz -C /usr/local/
RUN cd /usr/local && ln -s spark-1.3.1-bin-hadoop2.6 spark
ENV SPARK_HOME /usr/local/spark

spark131-jre8-all

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM louz/spark131-jre8
MAINTAINER Louz
## install ssh
RUN apt-get update && apt-get install -y ssh
RUN ssh-keygen -q -N "" -t rsa -f /root/.ssh/id_rsa
RUN cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
ENV SPARK_HOME /usr/local/spark
## config local slave node
RUN cp $SPARK_HOME/conf/slaves.template $SPARK_HOME/conf/slaves
RUN cp $SPARK_HOME/conf/spark-defaults.conf.template $SPARK_HOME/conf/spark-defaults.conf
#RUN sed -i "5c spark.master spark://localhost:7077" $SPARK_HOME/conf/spark-defaults.conf
RUN echo "spark.master spark://localhost:7077" $SPARK_HOME/conf/spark-defaults.conf
## start master and slave when the container init
ENTRYPOINT ["/bin/bash","-c","service ssh start && /usr/local/spark/sbin/start-all.sh && tail -f /usr/local/spark/logs/spark*.out"]
#ENTRYPOINT ["service ssh start && /usr/local/spark/sbin/start-all.sh"]

通过

1
docker build -f <path/to/Dockerfile> -t <image tag> .

命令分别构建出louz/spark131-jre8louz/spark131-jre8-all两个镜像

运行

1
docker run -d -p 8080:8080 -p 7077:7077 -h sparkall louz/spark131-jre8-all

即可启动一个spark集群,访问http://<dockerIP>:8080可以看到spark master的管理页面。

上面运行命令有个要注意的地方是需要加-h参数执行启动的容器的hostname,否则容器的名字会是一个随机生成的名字,导致spark master节点的地址spark://<masterName>:7077中的masterName也是随机的名字,后续spark-shell或spark-submit要指定master地址时会比较麻烦

spark客户端访问

最简单的访问方式是通过spark-shell访问,在客户端机器输入以下命令

1
2
cd $SPARK_HOME
bin/spark-shell --master spark://sparkall:7077

注意,需要在客户端机器先配置sparkall的ip映射