ちょっと Spark クラスタを試すためにわざわざ Amazon EMR を起動させたりするのも面倒なので、Docker で出来るようにした。
Dockerfile を用意する
FROM openjdk:8
ARG SPARK_VERSION=2.4.5
ARG HADOOP_VERSION=2.7
RUN wget -q http://apache.mirror.iphh.net/spark/spark-${SPARK_VERSION}/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz \
&& tar xzf spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz \
&& mv spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION} /spark \
&& rm spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz
EXPOSE 8080
やっていることは
- OpenJDK 8 イメージをベースにする
- Spark バイナリをダウンロードして
/spark
に配置する
だけ。
docker-compose.yml を用意する
クラスタを同時に起動するために Docker Compose を利用する。
docker-compose.yml
version: '3'
services:
master:
build: .
ports:
- 4040:4040
- 8080:8080
command: /spark/bin/spark-class org.apache.spark.deploy.master.Master --host 0.0.0.0
worker:
build: .
depends_on:
- master
ports:
- 8081-8089:8081
command: /spark/bin/spark-class org.apache.spark.deploy.worker.Worker spark://master:7077 --host 0.0.0.0
Docker Compose で起動する場合はデフォルトではすべてのコンテナが同じ仮想ネットワーク内で起動するため、Worker ノードから spark://master:7077
で Master ノードに接続することが出来る。
クラスタを起動する
$ docker-compose up -d
Master ノードと Worker ノードが一台ずつ起動する。
ブラウザから Spark の Web UI (http://localhost:8080/) にアクセスすると、いまクラスタがどういう状態になっているのかを確認することが出来る。
Worker ノードの数を変更する
$ docker-compose up -d --scale worker=2
これで Worker ノードが2台に増える。
spark-shell を起動してみる
$ docker-compose exec master /spark/bin/spark-shell --master spark://localhost:7077
Spark context Web UI available at http://b5d1fcbe1a7b:4040
Spark context available as 'sc' (master = spark://localhost:7077, app id = app-20180709092212-0003).
Spark session available as 'spark'.Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.3.1
/_/
Using Scala version 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_171)Type in expressions to have them evaluated.
Type :help for more information.
scala>
spark-shell が起動したので、ここから色々と試すことが出来る。
scala> sc
res0: org.apache.spark.SparkContext = org.apache.spark.SparkContext@4fa91d5b
scala> val ds = Seq(1, 2, 3).toDS()
ds: org.apache.spark.sql.Dataset[Int] = [value: int]
scala> ds.show()
+-----+
|value|
+-----+
| 1|
| 2|
| 3|
+-----+
scala> ds.map(_ * 2).show()
+-----+
|value|
+-----+
| 2|
| 4|
| 6|
+-----+
ブラウザから Spark Context Web UI (http://localhost:4040/) にアクセスすると、ジョブの実行状況などを詳しく見ることが出来る。