Sparkコンテナ(勉強用)
Sparkの勉強するのに、また手元の開発環境ごちゃごちゃになるのは困るのでDockerコンテナを作ってみた話。
初め探してsequenceiqのとかあったけど、Dockerのマルチコンテナでのクラスタの組み方とかも勉強したかったので作ることにした。クラスタマネージャはとりあえずYARN、今回は1つのDockerホストで、マスター(クラスタマネージャ)、スレーブ(ワーカー)、Sparkクライアントのコンテナを走らせる。
#はじめ、マルチホストのDockerクラスタでも動くようにしたかったけど、まだちょっとあれだった
コンテナ接続
クラスタ内のコンテナ接続、単純なクライアントサーバ的な一方行の静的なコンテナ接続は、Dockerのリンク機能が使えるけど、Sparkクラスタの場合、いろいろ動的にJVMプロセスが立ち上がってIPCするので、厳しい。
コンテナ接続パターンはいろいろあるけど、シングルDockerホストマルチコンテナのクラスタであれば今のところdnsmasqを利用する方法がシンプルかと
Using dnsmasq to link Docker containers
chef/centos-7.0のVagrant boxをベースにセットアップ、dockerのバージョンは1.6、1.7+だとBridgeインタフェースが作成されなくて動かなかった、なんかネットワーク周りに機能変更あったぽい
1. dnsmasqをインストール
$ yum install -y dnsmasq
2. dockerネットワークの設定を追加
# /etc/dnsmasq.d/docker-dns addn-hosts=/etc/docker-container-hosts interface=docker0
3. 自動起動を有効化、起動
$ systemctl enable dnsmasq $ systemctl start dnsmasq
あとは、コンテナの起動ときに、dnsオプションでdocker0(172.17.42.1)インタフェースを指定して、hostnameも指定しておけばコンテナ間で名前解決できる
hostsファイルは、コンテナをrun, startした後に、下のスクリプトで更新する仕組み。
#!/bin/bash # Domain name for containers CONTAINER_DOMAIN=containers.dev # Path to the addn-hosts file CONTAINER_HOSTS=/etc/docker-container-hosts echo "# Auto-generated by $0" > $CONTAINER_HOSTS for CID in `docker ps -q`; do IP=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CID` NAME=`docker inspect --format '{{ .Config.Hostname }}' $CID` echo "$IP $NAME.$CONTAINER_DOMAIN $NAME" >> $CONTAINER_HOSTS done # Ask dnsmasq to reload addn-hosts pkill -HUP -x dnsmasq
hostsファイル(/etc/docker-container-hosts)
# Auto-generated by ./bin/update_docker_hosts.sh 172.17.0.4 hdp2.containers.dev hdp3 172.17.0.3 hdp2.containers.dev hdp2 172.17.0.2 spark.containers.dev spark 172.17.0.1 hdp1.containers.dev hdp1
あと、ポートは、設定ファイル(core-site.xml, yarn-site.xml, hdfs-site.xml, mapred-site.xml, spark.defaults)に明示して、コンテナからEXPOSEしておく。
さらにVM(Dockerホスト)のホストOSからアクセスするポート(ノートブック等のWebUI)は、コンテナをrunする時に、portsオプションで見えるようにしとく。
ノートブック
ノートブック環境は、Python用に、IPython Notebook。Scala用に、Spark Notebookを使って見る。
設定は、Dockerファイルみればわかるけど、仕組みあんまり理解できてないので、またおいおい整理
その他備忘録
- Java8でやっててなんかエラーでて、とりあえずJava7にしたら動いたので、そのままにしてるけど、なんか動きそうなのでもっかいやってみる
hadoop - Spark Pi Example in Cluster mode with Yarn: Association lost - Stack Overflow
[SPARK-6388] Spark 1.3 + Hadoop 2.6 Can't work on Java 8_40 - ASF JIRA