Sparkの構築
Apache Sparkの構築
Apache Maven
Mavenに基づいたビルドはApache Sparkのためのリファレンスのビルドです。Mavenを使ったSparkのビルドはMaven 3.6.3 と Java 8 を必要とします。Spark は Scala 2.12/2.13 を必要とします; Scala 2.11 のサポートは Spark 3.0.0 で削除されました。
Mavenのメモリの使い方のセットアップ
MAVEN_OPTS
を設定することで、普段より多くのメモリを使うようにMavenを設定する必要があるでしょう:
export MAVEN_OPTS="-Xss64m -Xmx2g -XX:ReservedCodeCacheSize=1g"
(ReservedCodeCacheSize
設定は任意ですが、お勧めです。) これらのパラメータをMAVEN_OPTS
に追加しない場合、以下のようなエラーと警告を見るかも知れません:
[INFO] Compiling 203 Scala sources and 9 Java sources to /Users/me/Development/spark/core/target/scala-2.12/classes...
[ERROR] Java heap space -> [Help 1]
前述したMAVEN_OPTS
変数を設定することでこれらの問題を修正できます。
注意:
MAVEN_OPTS
セット無しでbuild/mvn
を使う場合は、スクリプトは自動的に前述のオプションをMAVEN_OPTS
環境変数に追加するでしょう。- Sparkビルドの
test
フェーズは、build/mvn
を使っていない場合でも、自動的にこれらのオプションをMAVEN_OPTS
に設定するでしょう。
build/mvn
今ではSparkはbuild/
ディレクトリの下のソースから簡単にビルドおよびSparkの配備をするように自己内包Mavenインストレーションと一緒にパッケージ化されています。このスクリプトは自動的に全ての構築に必要なものをbuild/
ディレクトリの中に内部的にダウンロードおよびセットアップします (Maven, Scala) 。なんらかの<mvn
バイナリが既にあれば光栄ですが、それはScalaおよびZinc自身のコピーを適切なバージョンに一致するかに関係なくダウンロードしてくるでしょう。build/mvn
execution は以前のビルドメソッドへの簡単な移行ができるmvn
への呼び出しとして振る舞うことができます。例として、以下のようにしてSparkのバージョンを構築することができます:
./build/mvn -DskipTests clean package
他の構築の例は以下で見つけることができます。
実行可能な分散の構築
Spark Downloadsページで配布されているようなSparkの配布物を作成し、実行可能なように配置するには、プロジェクトのルートディレクトリにある./dev/make-distribution.sh
を使います。直接MavenビルドをするようにMavenプロファイル設定などを設定することができます。例:
./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Psparkr -Phive -Phive-thriftserver -Pmesos -Pyarn -Pkubernetes
これはPython pip と Rパッケージと一緒にSpark配布物をビルドするでしょう。使い方についての詳しい情報は、./dev/make-distribution.sh --help
を実行してください。
Hadoopバージョンの指定とYARNの有効化
hadoop.version
プロパティを使ってコンパイルするHadoopの正確なバージョンを指定することができます。
yarn
プロファイルを有効にすることができ、hadoop.version
と異なる場合には任意でyarn.version
を設定することができます。
例:
./build/mvn -Pyarn -Dhadoop.version=3.3.0 -DskipTests clean package
Hadoop 2.x を使ってビルドしたい場合は、hadoop-2.7 プロファイルを有効にします:
./build/mvn -Phadoop-2.7 -Pyarn -Dhadoop.version=2.8.5 -DskipTests clean package
HiveおよびJDBCサポートの構築
JDBCサーバとCLIを伴うSpark SQLのためにHive統合を有効にするには、-Phive
および-Phive-thriftserver
プロファイルを既存のビルドオプションに追加します。デフォルトでは Spark は Have 2.3.9 と一緒にビルドされるでしょう。
# Hive 2.3.9 サポート
./build/mvn -Pyarn -Phive -Phive-thriftserver -DskipTests clean package
YARNのHadoop依存無しのパッケージング
mvn package
で生成されたアセンブリ ディレクトリは、デフォルトで全てのSparkの配布物、Hadoopおよび幾つかのエコシステムプロジェクトを含むでしょう。YARNデプロイメントでは、これは複数のバージョンがexecutorのクラスパスに現れることを引き起こします; Sparkアセンブリ内にパッケージされているバージョンと各ノード上のバージョン、yarn.application.classpath
に含まれているバージョンです。hadoopが提供する
プロファイルは、ZooKeeperおよびHadoopそれ自身のようなHadoopエコシステムプロジェクトを含むこと無しにアセンブリを構築します。
Mesosサポートのビルド
./build/mvn -Pmesos -DskipTests clean package
Kubernetesサポートのビルド
./build/mvn -Pkubernetes -DskipTests clean package
サブモジュールの個別の構築
mvn -pl
オプションを使ってSparkのサブモジュールを構築することが可能です。
例えば、Sparkストリーミングモジュールを以下を使って構築することができます:
./build/mvn -pl :spark-streaming_2.12 clean install
ここで、spark-streaming_2.12
はstreaming/pom.xml
ファイル内で定義されたartifactId
です。
継続した寄せ集め
逐次および継続的な寄せ集めをサポートするscale-maven-pluginを使用します。例えば、
./build/mvn scala:cc
は、継続的な寄せ集めを実行しなければなりません (つまり、変更を待ちます)。しかしながら、これは広範囲に渡ってテストされていません。注意すべき問題点:
-
パス
src/main
およびsrc/test
(docsを参照)のみをスキャンするため、構造のサブモジュール内のみで動作するでしょう。 -
一般的に特定のサブモジュール内でコンパイルを動作させるには、プロジェクトのルートから
mvn install
を実行する必要があるでしょう; これは他のサブモジュールに依存するサブモジュールはspark-parent
モジュールを通じてそうするからです。
従って、継続的なcore
サブモジュールの寄せ集めを実行するためのフローは以下のようになるかも知れません:
$ ./build/mvn install
$ cd core
$ ../build/mvn scala:cc
SBTを使った構築
Maven はSparkのパッケージングのための公式なお勧めのビルドツールです。そしてbuild of referenceです。しかし、SBTは継続的な寄せ集めでもっと高速なので、日々の開発をサポートされます。より進歩的な開発者はSBTを使いたいと思うかも知れません。
SBT ビルドはMaven POMファイルから派生したため、同じMavenプロファイルと変数がSBTビルドを制御するために設定することができます。例えば:
./build/sbt package
毎回sbtを起動するオーバーヘッドを避けるために、再コンパイルする必要があります。build/sbt
を実行することでsbtを対話モードで起動することができ、コマンドプロンプトで全てのビルドコマンドを実行します。
SBT のメモリ使用量の設定
プロジェクトルートの .jvmopts
で SBT のための JVM オプションを設定します。例えば:
-Xmx2g
-XX:ReservedCodeCacheSize=1g
これら2つのオプションの意味については、Maven のメモリ使用の設定のセクションを注意深く読んでください。
コンパイルの高速化
Sparkを頻繁にコンパイルする開発者は、コンパイルを高速化したいかも知れません; 例えば、集合JARの再コンパイルを避ける(SBTを使ってビルドする開発者)。どうやってこれを行うかの詳しい情報は、便利な開発ツールのページを参照してください。
暗号化ファイルシステム
暗号化されたファイルシステム上で構築する場合(例えば、もしホームディレクトリが暗号化されている場合)、Sparkの構築は"Filename too long"エラーで失敗するかも知れません。次善策として、プロジェクトのpom.xml
にscala-maven-plugin
の構成引数に以下のものを追加します:
<arg>-Xmax-classfile-name</arg>
<arg>128</arg>
以下のように project/SparkBuild.scala
の中に追加します:
scalacOptions in Compile ++= Seq("-Xmax-classfile-name", "128"),
sharedSettings
の値。これらの行をどこに追加するか自信が無ければ、this PRも見てください。
IntelliJ IDEA あるいは Eclipse
Spark開発のためのIntelliJ IDEA あるいはEclipseでのセットアップのヘルプは、便利な開発ツールのページを見てください。
テストの実行
デフォルトでは ScalaTest Maven pluginを使ってテストが実行されます。テストはrootあるいはadminユーザとして実行すべきでは無い事に注意してください。
以下はテストを実行するコマンドの例です:
./build/mvn test
SBTを使ったテスト
以下はテストを実行するコマンドの例です:
./build/sbt test
個々のテストの実行
個々のテストをどうやって実行するかについての情報は、便利な開発ツールのページを参照してください。
インストール可能な PySpark pip
Python環境で使うためにSparkをビルドしていて、pipインストールしたい場合は、上で説明したように最初にSpark Jarをビルドする必要があるでしょう。そうすればsetup.pyとpip installableパッケージに適したsdistパッケージを構築することができます。
cd python; python setup.py sdist
注意: パッケージ化の必要性からPythonディレクトリから直接pip installすることができません。むしろ上で述べたように最初にsdistパッケージをビルドすべきです。
他のやり方として、-pipオプションを使って make-distributionを実行することもできます。
MavenあるいはSBTを使ったPySparkのテスト
PySparkをビルドしていて、PySparkテストを実行したい場合は、Hiveサポートと一緒にSparkをビルドする必要があるでしょう。
./build/mvn -DskipTests clean package -Phive
./python/run-tests
SBTを使ってPySparkをビルドしていて、PySparkテストを実行したい場合は、Hiveサポートと一緒にSparkをビルドし、テストもビルドする必要があるでしょう。
./build/sbt -Phive clean package
./build/sbt test:compile
./python/run-tests
run-tests スクリプトは特定のPythonのバージョンあるいは特定のモジュールに制限することもできます。
./python/run-tests --python-executables=python --modules=pyspark-sql
R のテストの実行
SparkR テストを実行するには、knitr, rmarkdown, testthat, e1071 および survival パッケージを最初にインストールする必要があるでしょう。
Rscript -e "install.packages(c('knitr', 'rmarkdown', 'devtools', 'testthat', 'e1071', 'survival'), repos='https://cloud.r-project.org/')"
以下のコマンドを使ってSparkRテストのみを実行することができます:
./R/run-tests.sh
Dockerに基づいた統合テストスィーツ
Dockerの統合テストを実行するには、boxにdocker
エンジンをインストールする必要があります。インストレーションの説明はDocker サイトで見つけることができます。一度インストールしてからまだ実行されてない場合は、docker
サービスを開始する必要があります。Linux上では、sudo service docker start
によって行うことができます。
./build/mvn install -DskipTests
./build/mvn test -Pdocker-integration-tests -pl :spark-docker-integration-tests_2.12
あるいは
./build/sbt docker-integration-tests/test
Scalaバージョンの変更
2.13 のような Scala の他のバージョンがサポートされる場合、そのバージョンをビルドすることができます。以下のように Scala のメジャーバージョンを変更します (例えば 2.13):
./dev/change-scala-version.sh 2.13
プロファイルを有効にする (例えば 2.13):
# Mavenの場合
./build/mvn -Pscala-2.13 compile
# sbtの場合
./build/sbt -Pscala-2.13 compile
GitHub Enterprise を使った Jenkins テストの実行
Jenkins を使ったテストを実行するには:
./dev/run-tests-jenkins
個々のレポジトリ、あるいは GitHub Enterprise 上のレポジトリ を使う場合は、上のコマンドを実行する前に以下の環境変数をエクスポートします。
関係する環境変数
変数名 | デフォルト | 意味 |
---|---|---|
SPARK_PROJECT_URL |
https://github.com/apache/spark | GitHub Enterprise の Spark プロジェクトのURL。 |
GITHUB_API_BASE |
https://api.github.com/repos/apache/spark | GitHub Enterprise の Spark プロジェクト API サーバの URL。 |