Sparkの構築
Apache Sparkの構築
Apache Maven
Mavenに基づいたビルドはApache Sparkのためのリファレンスのビルドです。Mavenを使ったSparkのビルドはMaven 3.3.9 あるいはそれ以上と、Java 7+を必要とします。
Mavenのメモリの使い方のセットアップ
MAVEN_OPTS
を設定することで、普段より多くのメモリを使うようにMavenを設定する必要があるでしょう。以下の設定をお勧めします:
export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
もしこれを実行しなければ、以下のようなエラーを見るかも知れません:
[INFO] Compiling 203 Scala sources and 9 Java sources to /Users/me/Development/spark/core/target/scala-2.11/classes...
[ERROR] PermGen space -> [Help 1]
[INFO] Compiling 203 Scala sources and 9 Java sources to /Users/me/Development/spark/core/target/scala-2.11/classes...
[ERROR] Java heap space -> [Help 1]
以前に話した内容をMAVEN_OPTS
変数に設定することでこれをなすことができます。
注意:
- Java 8以上については、このステップは必要ありません。
MAVEN_OPTS
セット無しでbuild/mvn
を使う場合は、このスクリプトはこれを自動化するでしょう。
build/mvn
今ではSparkはbuild/
ディレクトリの下のソースから簡単にビルドおよびSparkの配備をするように自己内包Mavenインストレーションと一緒にパッケージ化されています。このスクリプトは自動的に全ての構築に必要なものをbuild/
ディレクトリの中に内部的にダウンロードおよびセットアップします (Maven, Scala および Zinc) 。なんらかのmvn
バイナリが既にあれば光栄ですが、それはScalaおよびZinc自身のコピーを適切なバージョンに一致するかに関係なくダウンロードしてくるでしょう。build/mvn
execution は以前のビルドメソッドへの簡単な移行ができるmvn
への呼び出しとして振る舞うことができます。例として、以下のようにしてSparkのバージョンを構築することができます:
./build/mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -DskipTests clean package
他の構築の例は以下で見つけることができます。
実行可能な分散の構築
Spark Downloadsページで配布されているようなSparkの配布物を作成し、実行可能なように配置するには、プロジェクトのルートディレクトリにある./dev/make-distribution.sh
を使います。直接MavenビルドをするようにMavenプロファイル設定などを設定することができます。例:
./dev/make-distribution.sh --name custom-spark --tgz -Psparkr -Phadoop-2.4 -Phive -Phive-thriftserver -Pyarn
使い方についての詳しい情報は、./dev/make-distribution.sh --help
を実行してください。
Hdoopバージョンの指定
HDFSはバージョンを超えたプロトコルの互換性が無いため、HDFSから読み込みたい場合は、環境の特定のHDFSのSparkを構築する必要があるでしょう。これはhadoop.version
プロパティを使って行うことができます。設定しない場合は、デフォルトでSparkはHadoop 2.2.0の構築ができないでしょう。特定のHadoopバージョンに対して特定のビルドプロファイルが必要なことに注意してください。
Hadoop バージョン | 必要なプロファイル |
---|---|
2.2.x | hadoop-2.2 |
2.3.x | hadoop-2.3 |
2.4.x | hadoop-2.4 |
2.6.x | hadoop-2.6 |
2.7.x 以降の 2.x | hadoop-2.7 |
yarn
プロファイルを有効にすることができ、hadoop.version
と異なる場合には任意でyarn.version
を設定することができます。Spark はYARNバージョン2.2.0以降をサポートします。
例:
# Apache Hadoop 2.2.X
./build/mvn -Pyarn -Phadoop-2.2 -DskipTests clean package
# Apache Hadoop 2.3.X
./build/mvn -Pyarn -Phadoop-2.3 -Dhadoop.version=2.3.0 -DskipTests clean package
# Apache Hadoop 2.4.X or 2.5.X
./build/mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=VERSION -DskipTests clean package
# Apache Hadoop 2.6.X
./build/mvn -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0 -DskipTests clean package
# Apache Hadoop 2.7.X and later
./build/mvn -Pyarn -Phadoop-2.7 -Dhadoop.version=VERSION -DskipTests clean package
# Different versions of HDFS and YARN.
./build/mvn -Pyarn -Phadoop-2.3 -Dhadoop.version=2.3.0 -Dyarn.version=2.2.0 -DskipTests clean package
HiveおよびJDBCサポートの構築
JDBCサーバとCLIを伴うSpark SQLのためにHive統合を有効にするには、-Phive
およびPhive-thriftserver
プロファイルを既存のビルドオプションに追加します。デフォルトではSparkはHave 1.2.1 バインドと一緒にビルドされるでしょう。
# Apache Hadoop 2.4.X with Hive 1.2.1 support
./build/mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -Phive -Phive-thriftserver -DskipTests clean package
YARNのHadoop依存無しのパッケージング
mvn package
で生成されたアセンブリ ディレクトリは、デフォルトで全てのSparkの配布物、Hadoopおよび幾つかのエコシステムプロジェクトを含むでしょう。YARNデプロイメントでは、これは複数のバージョンがexecutorのクラスパスに現れることを引き起こします; Sparkアセンブリ内にパッケージされているバージョンと各ノード上のバージョン、yarn.application.classpath
に含まれているバージョンです。hadoopが提供する
プロファイルは、ZooKeeperおよびHadoopそれ自身のようなHadoopエコシステムプロジェクトを含むこと無しにアセンブリを構築します。
Scala 2.10 のための構築
Scala 2.10と一緒にコンパイルされたSparkパッケージを生成するには、-Dscala-2.10
プロパティを使ってください:
./dev/change-scala-version.sh 2.10
./build/mvn -Pyarn -Phadoop-2.4 -Dscala-2.10 -DskipTests clean package
サブモジュールの個別の構築
mvn -pl
オプションを使ってSparkのサブモジュールを構築することが可能です。
例えば、Sparkストリーミングモジュールを以下を使って構築することができます:
./build/mvn -pl :spark-streaming_2.11 clean install
ここで、spark-streaming_2.11
は 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
Zincを使った寄せ集めのスピードアップ
Zinc はSBTの逐次コンパイラの長く実行されるサーババージョンです。バックグラウンドプロセスとしてローカルで実行する場合、SparkのようなScalaベースのプロジェクトの構築をスピードアップします。Mavenを使ってSparkを定期的に再コンパイルする開発者はZincに最も興味があるでしょう。プロジェクトサイトで zinc
の構築と実行の使用方法を得るでしょう; OS X ユーザは brew install zinc
を使ってインストールすることができます。
build/mvn
パッケージの zinc
を使うと、自動的に全てのビルドのダウンロードおよび利用が行われます。このプロセスは、ZINC_PORT
環境変数が設定されていない場合は、最初の build/mvn
が呼ばれた時に自動開始されポート3030をバインドするでしょう。zinc
プロセスはbuild/zinc-<version>/bin/zinc -shutdown
を実行することでいつでもシャットダウンされ、 build/mvn
が呼ばれた時はいつでも自動的に再起動されるでしょう。
SBTを使った構築
Maven はSparkのパッケージングのための公式なお勧めのビルドツールです。そしてbuild of referenceです。しかし、SBTは継続的な寄せ集めでもっと高速なので、日々の開発をサポートされます。より進歩的な開発者はSBTを使いたいと思うかも知れません。
SBT ビルドはMaven POMファイルから派生したため、同じMavenプロファイルと変数がSBTビルドを制御するために設定することができます。例えば:
./build/sbt -Pyarn -Phadoop-2.3 package
毎回sbtを起動するオーバーヘッドを避けるために、再コンパイルする必要があります。build/sbt
を実行することでsbtを対話モードで起動することができ、コマンドプロンプトで全てのビルドコマンドを実行します。ビルド時間の削減についての更なるお勧めは wiki pageを参照してください。
暗号化ファイルシステム
暗号化されたファイルシステム上で構築する場合(例えば、もしホームディレクトリが暗号化されている場合)、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でのセットアップのヘルプは、IDEセットアップのためのwikiページを見てください。
テストの実行
デフォルトでは ScalaTest Maven pluginを使ってテストが実行されます。
幾つかのテストはSparkが最初にパッケージされていることを必要とするため、最初に-DskipTests
をつけてmvn package
を常に実行してください。以下は正しい(ビルド、テスト)の順番の例です:
./build/mvn -Pyarn -Phadoop-2.3 -DskipTests -Phive -Phive-thriftserver clean package
./build/mvn -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver test
ScaleTestプラグインはまた以下のようにして特定のScalaのテストスイートのみの実行をサポートします:
./build/mvn -P... -Dtest=none -DwildcardSuites=org.apache.spark.repl.ReplSuite test
./build/mvn -P... -Dtest=none -DwildcardSuites=org.apache.spark.repl.* test
あるいは Javaテスト:
./build/mvn test -P... -DwildcardSuites=none -Dtest=org.apache.spark.streaming.JavaAPISuite
SBTを使ったテスト
幾つかのテストはSparkが最初にパッケージされることを必要とするため、最初にbuild/sbt package
を常に実行してください。以下は正しい(ビルド、テスト)の順番の例です:
./build/sbt -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver package
./build/sbt -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver test
以下のようにして特定のテストスイートだけを実行します:
./build/sbt -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver "test-only org.apache.spark.repl.ReplSuite"
./build/sbt -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver "test-only org.apache.spark.repl.*"
以下のようにして特定のサブプロジェクトのテストスイートだけを実行します:
./build/sbt -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver core/test
Java 8 テストスイートの実行
Java8 テストだけの実行
./build/mvn install -DskipTests
./build/mvn -pl :java8-tests_2.11 test
あるいは
./build/sbt java8-tests/test
Java 8 JDKが検知された場合は、Java 8 テストが自動的に有効になります。JDK8をインストールしたがシステムのデフォルトでは無い場合は、テストを実行する前に JAVA_HOME をJDK 8 を示すように設定することができます。
Mavenを使ったPySparkのテスト
PySparkをビルドしていて、PySparkテストを実行したい場合は、Hiveサポートと一緒にSparkをビルドする必要があるでしょう。
./build/mvn -DskipTests clean package -Phive
./python/run-tests
run-tests スクリプトは特定のPythonのバージョンあるいは特定のモジュールに制限することもできます。
./python/run-tests --python-executables=python --modules=pyspark-sql
注意: Hiveサポートと一緒にSparkをビルドする場合には、sbtビルドと一緒にPythonテストを実行することもできます。
R のテストの実行
SparkRテストを実行するには、R パッケージtestthat
をインストールする必要があるでしょう(Rシェルから install.packages(testthat)
を実行します)。以下のコマンドを使ってSparkRテストのみを実行することができます:
./R/run-tests.sh
Dockerに基づいた統合テストスィーツ
Dockerの統合テストを実行するには、boxにdocker
エンジンをインストールする必要があります。インストレーションの説明はDocker サイトで見つけることができます。一度インストールしてからまだ実行されてない場合は、docker
サービスを開始する必要があります。Linux上では、sudo service docker start
によって行うことができます。
./build/mvn install -DskipTests
./build/mvn -Pdocker-integration-tests -pl :spark-docker-integration-tests_2.11
あるいは
./build/sbt docker-integration-tests/test