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 変数を設定することでこれらの問題を修正できます。

注意:

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.12streaming/pom.xmlファイル内で定義されたartifactId です。

継続した寄せ集め

逐次および継続的な寄せ集めをサポートするscale-maven-pluginを使用します。例えば、

./build/mvn scala:cc

は、継続的な寄せ集めを実行しなければなりません (つまり、変更を待ちます)。しかしながら、これは広範囲に渡ってテストされていません。注意すべき問題点:

従って、継続的な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.xmlscala-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。
TOP
inserted by FC2 system