Spark
docker

Docker でお試し Spark クラスタを構築する

ちょっと Spark クラスタを試すためにわざわざ Amazon EMR を起動させたりするのも面倒なので、Docker で出来るようにした。

Dockerfile を用意する

FROM openjdk:8

ENV SPARK_VERSION=2.3.1
ENV 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:
    image: .
    ports:
      - 4040:4040
      - 8080:8080
    command: /spark/bin/spark-class org.apache.spark.deploy.master.Master --host 0.0.0.0

  worker:
    image: .
    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/) にアクセスすると、ジョブの実行状況などを詳しく見ることが出来る。