dshimizu/blog/alpha

とりとめのないITブログ

Apache Spark のクラスターを Standalone Mode で動かしてみる

はじめに

Apache Spark のクラスターモードを動かしてみたく、 Standalone Mode で動かしてみた。

環境

Spark、Java 共に Homebrew でインストールしたものを使う。

試した際の Spark のバージョンは 3.2.1

% spark-shell --version
22/08/20 23:03:29 WARN Utils: Your hostname, MacBook-Pro.local resolves to a loopback address: 127.0.0.1; using 192.168.0.110 instead (on interface en0)
22/08/20 23:03:29 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.spark.unsafe.Platform (file:/usr/local/Cellar/apache-spark/3.2.1/libexec/jars/spark-unsafe_2.12-3.2.1.jar) to constructor java.nio.DirectByteBuffer(long,int)
WARNING: Please consider reporting this to the maintainers of org.apache.spark.unsafe.Platform
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 3.2.1
      /_/

Using Scala version 2.12.15, OpenJDK 64-Bit Server VM, 11.0.14.1
Branch HEAD
Compiled by user hgao on 2022-01-20T19:26:14Z
Revision 4f25b3f71238a00508a356591553f2dfa89f8290
Url https://github.com/apache/spark
Type --help for more information.

Java のバージョンは 11.0.14.1

% java --version
openjdk 11.0.14.1 2022-02-08
OpenJDK Runtime Environment Homebrew (build 11.0.14.1+0)
OpenJDK 64-Bit Server VM Homebrew (build 11.0.14.1+0, mixed mode)

クラスターモード

Spark のプログラムを実行する際に、そのプログラムを動かす場所となるクラスターを指定できる。これによって分散処理を実行できる。 2022 年 5 月時点の 3.2 系では、以下の4つを利用可能。

Standalone モードのクラスターを動かす

Standaloneモードを使ってみる。*1

まず、Java を利用できるように環境変数を設定する。

export JAVA_HOME='/usr/local/Cellar/openjdk@11/11.0.14.1'
export PATH=${JAVA_HOME}/bin:${PATH}

マスターを起動する。デフォルトだとマスターとの通信に spark://localhost:7077 が利用される。

% /usr/local/Cellar/apache-spark/3.2.1/libexec/sbin/start-master.sh
starting org.apache.spark.deploy.master.Master, logging to /usr/local/Cellar/apache-spark/3.2.1/libexec/logs/spark-xxxxxxxx-org.apache.spark.deploy.master.Master-1-xxxxxxxx.out

スレーブを起動する。引数にマスターを指定する。

% /usr/local/Cellar/apache-spark/3.2.1/libexec/sbin/start-slave.sh spark://localhost:7077
This script is deprecated, use start-worker.sh
starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/Cellar/apache-spark/3.2.1/libexec/logs/spark-xxxxxxxx-org.apache.spark.deploy.worker.Worker-1-xxxxxxxx.out

スクリプト共に引数を使ってオプションを指定できるけど、一旦デフォルトとする。

http://localhost:8080/ダッシュボードを参照可能になる。この時点だと、 Workers の項目に1つ実行中である Worker Id が表示されているだけである。

Standalone モードのクラスター上で、ジョブを動かす

チュートリアルのプログラムを用意する。*2

from pyspark.sql import SparkSession

logFile = "/usr/local/Cellar/apache-spark/3.2.1/README.md"  # Should be some file on your system
spark = SparkSession.builder.appName("SimpleApp").getOrCreate()
logData = spark.read.text(logFile).cache()

numAs = logData.filter(logData.value.contains('a')).count()
numBs = logData.filter(logData.value.contains('b')).count()

print("Lines with a: %i, lines with b: %i" % (numAs, numBs))

spark.stop()

このプログラムをクラスター上で動かす。 spark-submit の引数に --master spark://localhost:7077 として、クラスターを指定する。

% /usr/local/Cellar/apache-spark/3.2.1/libexec/bin/spark-submit --master spark://localhost:7077 SimpleApp.py

http://localhost:8080/ にアクセスしてダッシュボードを見ると、Running ApplicationsApplication ID が表示されていることが確認できる。ジョブが完了すると Completed ApplicationsApplication ID が表示される。

とりあえず、これでクラスターモードで動くことが確認できた。

クラスター停止

以下でマスター、スレーブともに停止できる。

% /usr/local/Cellar/apache-spark/3.2.1/libexec/sbin/stop-master.sh
% /usr/local/Cellar/apache-spark/3.2.1/libexec/sbin/stop-slave.sh 

まとめ

Apache Spark のクラスターを Standalone Mode で動かしてみた。 プロダクション用途で使うことはないと思うものの、Spark そのものがStandalone Modeの時にどうやって動いているのかまだよくわかっていないのでまたどこかで調べたい。