はじめに
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
- Apache Mesos (非推奨)
- YARN
- Kubernetes
Standalone モードのクラスターを動かす
Standaloneモードを使ってみる。*1
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 モードのクラスター上で、ジョブを動かす
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 Applications
に Application ID
が表示されていることが確認できる。ジョブが完了すると Completed Applications
に Application 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の時にどうやって動いているのかまだよくわかっていないのでまたどこかで調べたい。