Sparkコンテナ(勉強用)

Sparkの勉強するのに、また手元の開発環境ごちゃごちゃになるのは困るのでDockerコンテナを作ってみた話。

github.com

初め探して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