やりたいこと
- 開発環境を汚さずにSparkのHistoryサーバーを使いたい!
- Docker使う場合、他のクラスターで実行した結果を、SparkのHistoryにお手軽に食わせられるようにしたい
課題
Dockerを使ってSparkを実行するためのDocker imageは多々あれども、Historyサーバーも含めて自動起動してくれるimageがない!(あっても見つからない)
解決方法
既存のDocker imageを構築するDockerfileをHistoryサーバーも起動するように変更する
ベースとするDockerfile(ビルド対象ソース)
バージョン
構築するDocker imageの内容は以下の通り。
JavaとHadoopのバージョンは、今回はたまたまこれというだけで、おそらく、別のバージョンでも同じ変更でいけると思う(試してないけど)
OS/ミドルウェア | バージョン | 補足 |
---|---|---|
CentOS | 6.5 | 7系だと色々と動かない |
Java | Oracle JDK7 | Java 8版のimageもあるが、まずはこれ |
Apache Hadoop | 2.7.2 | |
Apache Spark | 1.6.2 | 2.0.2や2.1.0のimageもあるが、まずはこれ |
手順
-
bootstrap.sh
の$HADOOP_PREFIX/sbin/start-yarn.sh
の次の行に以下の1行を追加する。${SPARK_HOME}/sbin/start-history-server.sh
-
Dockerfile
に以下の2行を追加するRUN mkdir /tmp/spark-events EXPOSE 18080
docker runの際に
-p 18080:18080
と-v /vagrant/logs/spark:/tmp/spark-events
(/vagrant/logs/spark
は他のクラスターのHistoryを格納するホスト側のパス)の指定を追加する
結果
bootstrap.sh
#!/bin/bash
: ${HADOOP_PREFIX:=/usr/local/hadoop}
$HADOOP_PREFIX/etc/hadoop/hadoop-env.sh
rm /tmp/*.pid
# installing libraries if any - (resource urls added comma separated to the ACP system variable)
cd $HADOOP_PREFIX/share/hadoop/common ; for cp in ${ACP//,/ }; do echo == $cp; curl -LO $cp ; done; cd -
# altering the core-site configuration
sed s/HOSTNAME/$HOSTNAME/ /usr/local/hadoop/etc/hadoop/core-site.xml.template > /usr/local/hadoop/etc/hadoop/core-site.xml
# setting spark defaults
echo spark.yarn.jar hdfs:///spark/spark-assembly-1.6.2-hadoop2.6.0.jar > $SPARK_HOME/conf/spark-defaults.conf
cp $SPARK_HOME/conf/metrics.properties.template $SPARK_HOME/conf/metrics.properties
if [ -z "${SPARK_HOME}" ]; then
export SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi
service sshd start
$HADOOP_PREFIX/sbin/start-dfs.sh
$HADOOP_PREFIX/sbin/start-yarn.sh
${SPARK_HOME}/sbin/start-history-server.sh
CMD=${1:-"exit 0"}
if [[ "$CMD" == "-d" ]];
then
service sshd stop
/usr/sbin/sshd -D -d
else
/bin/bash -c "$*"
fi
Dockerfile
FROM poad/docker-spark:1.6.2
USER root
COPY bootstrap.sh /etc/bootstrap.sh
RUN chown root.root /etc/bootstrap.sh
RUN chmod 700 /etc/bootstrap.sh
RUN mkdir /tmp/spark-events
EXPOSE 18080
ENTRYPOINT ["/etc/bootstrap.sh"]
起動コマンド
docker run -d -h sandbox -p 18080:18080 -p 50010:50010 -p 50020:50020 -p 50070:50070 -p 50075:50075 -p 50090:50090 -p 8020:8020 -p 9000:9000 -p 19888:19888 -p 8030:8030 -p 8031:8031 -p 8032:8032 -p 8033:8033 -p 8040:8040 -p 8042:8042 -p 8088:8088 -p 49707:49707 -p 2122:2122 -v /vagrant/logs/spark:/tmp/spark-events --name spark poad/docker-spark:1.6.2-with-history-server -d
最後に
ちなみに、Historyサーバーの起動は少し時間がかかる(1分くらい?)ため、それまでは成功しているのかわからない状態が続きます