目的
需要构建一个开箱即可用的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-jre8
和louz/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映射