Sparkの構築
build/mvn
を使った構築- 実行可能な分散の構築
- Mavenのメモリの使い方のセットアップ
- Hdoopバージョンの指定
- HiveおよびJDBCサポートの構築
- Scala 2.11のための構築
- MavenでのSparkのテスト
- サブモジュールの個別の構築
- 継続した寄せ集め
- IntelliJ IDEA あるいは Eclipseを使ったSparkの構築
- Java 8 テストスイートの実行
- YARN上のPySparkの構築
- YARNのHadoop依存無しのパッケージング
- SBTを使った構築
- SBTを使ったテスト
- Zincを使った寄せ集めのスピードアップ
Mavenを使ったSparkの構築には、Maven 3.3.3 以上およびJava 7+ が必要です。Sparkビルドは適したMavenバイナリを提供することができます; 以下を見てください。
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の構築は"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も見てください。
実行可能な分散の構築
Spark Downloadsページで配布されているようなSparkの配布物を作成し、実行可能なように配置するには、プロジェクトのルートディレクトリにあるmake-distribution.sh
を使います。直接MavenビルドをするようにMavenプロファイル設定などを設定することができます。例:
./make-distribution.sh --name custom-spark --tgz -Psparkr -Phadoop-2.4 -Phive -Phive-thriftserver -Pyarn
使い方についての詳しい情報は、./make-distribution.sh --help
を実行してください。
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.10/classes...
[ERROR] PermGen space -> [Help 1]
[INFO] Compiling 203 Scala sources and 9 Java sources to /Users/me/Development/spark/core/target/scala-2.10/classes...
[ERROR] Java heap space -> [Help 1]
以前に話した内容をMAVEN_OPTS
変数に設定することでこれをなすことができます。
注意:
- Java 8以上については、このステップは必要ありません。
MAVEN_OPTS
セット無しでbuild/mvn
を使う場合は、このスクリプトはこれを自動化するでしょう。
Hdoopバージョンの指定
HDFSはバージョンを超えたプロトコルの互換性が無いため、HDFSから読み込みたい場合は、環境の特定のHDFSのSparkを構築する必要があるでしょう。これはhadoop.version
プロパティを使って行うことができます。設定しない場合は、デフォルトでSparkはHadoop 2.2.0の構築ができないでしょう。特定のHadoopバージョンに対して特定のビルドプロファイルが必要なことに注意してください。
Hadoop バージョン | 必要なプロファイル |
---|---|
1.x から 2.1.x | hadoop-1 |
2.2.x | hadoop-2.2 |
2.3.x | hadoop-2.3 |
2.4.x | hadoop-2.4 |
2.6.x および 2.x以降 | hadoop-2.6 |
Apache Hadoop バージョン 1.x, Cloudera CDH “mr1” distributions, および YARNを使わない他のHadoopバージョンでは、以下を使用します:
# Apache Hadoop 1.2.1
mvn -Dhadoop.version=1.2.1 -Phadoop-1 -DskipTests clean package
# Cloudera CDH 4.2.0 with MapReduce v1
mvn -Dhadoop.version=2.0.0-mr1-cdh4.2.0 -Phadoop-1 -DskipTests clean package
yarn
プロファイルを有効にすることができ、hadoop.version
と異なる場合には任意でyarn.version
を設定することができます。Spark はYARNバージョン2.2.0以降をサポートします。
例:
# Apache Hadoop 2.2.X
mvn -Pyarn -Phadoop-2.2 -DskipTests clean package
# Apache Hadoop 2.3.X
mvn -Pyarn -Phadoop-2.3 -Dhadoop.version=2.3.0 -DskipTests clean package
# Apache Hadoop 2.4.X or 2.5.X
mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=VERSION -DskipTests clean package
Versions of Hadoop after 2.5.X may or may not work with the -Phadoop-2.4 profile (they were
released after this version of Spark).
# Different versions of HDFS and YARN.
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はHive 0.13.1をバインドしてビルドするでしょう。
# Apache Hadoop 2.4.X with Hive 13 support
mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -Phive -Phive-thriftserver -DskipTests clean package
Scala 2.11のための構築
Scale 2.11を使ってSparkパッケージを生成するには、-Dscala-2.11
プロパティを使います:
./dev/change-scala-version.sh 2.11
mvn -Pyarn -Phadoop-2.4 -Dscala-2.11 -DskipTests clean package
Spark はScale 2.11のJDBCコンポーネントをサポートしていません。
MavenでのSparkのテスト
デフォルトでは ScalaTest Maven pluginを使ってテストが実行されます。
幾つかのテストはSparkが最初にパッケージされていることを必要とするため、最初に-DskipTests
をつけてmvn package
を常に実行してください。以下は正しい(ビルド、テスト)の順番の例です:
mvn -Pyarn -Phadoop-2.3 -DskipTests -Phive -Phive-thriftserver clean package
mvn -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver test
ScaleTestプラグインはまた以下のようにして特定のテストスイートのみの実行をサポートします:
mvn -Dhadoop.version=... -DwildcardSuites=org.apache.spark.repl.ReplSuite test
サブモジュールの個別の構築
mvn -pl
オプションを使ってSparkのサブモジュールを構築することが可能です。
例えば、Sparkストリーミングモジュールを以下を使って構築することができます:
mvn -pl :spark-streaming_2.10 clean install
ここで、spark-streaming_2.10
はstreaming/pom.xml
ファイル内で定義されたartifactId
です。
継続した寄せ集め
逐次および継続的な寄せ集めをサポートするscale-maven-pluginを使用します。例えば、
mvn scala:cc
は、継続的な寄せ集めを実行しなければなりません (つまり、変更を待ちます)。しかしながら、これは広範囲に渡ってテストされていません。注意すべき問題点:
-
パス
src/main
およびsrc/test
(docsを参照)のみをスキャンするため、構造のサブモジュール内のみで動作するでしょう。 -
一般的に特定のサブモジュール内でコンパイルを動作させるには、プロジェクトのルートから
mvn install
を実行する必要があるでしょう; これは他のサブモジュールに依存するサブモジュールはspark-parent
モジュールを通じてそうするからです。
従って、継続的なcore
サブモジュールの寄せ集めを実行するためのフローは以下のようになるかも知れません:
$ mvn install
$ cd core
$ mvn scala:cc
IntelliJ IDEA あるいは Eclipseを使ったSparkの構築
Spark開発のためのIntelliJ IDEA あるいはEclipseでのセットアップのヘルプは、IDEセットアップのためのwikiページを見てください。
Java 8 テストスイートの実行
Java8 テストだけの実行
mvn install -DskipTests -Pjava8-tests
あるいは
sbt -Pjava8-tests java8-tests/test
Java 8テストは-Pjava8-tests
プロファイルが有効な場合にのみ実行されます。それらは -DskipTests
の代わりに実行されるでしょう。それらのテストがシステムを実行するためには、JDK8インストレーションが必要です。JDK8をインストールしたがシステムのデフォルトでは無い場合は、テストを実行する前に JAVA_HOME をJDK 8 を示すように設定することができます。
YARN上のPySparkの構築
YARN上のPySpark は、jarがMavenで構築された場合にのみサポートされます。更に、RedHatベースのオペレーションシステムでのこのアセンブリjarの構築には知られた問題があります(see SPARK-1753)。Red HatがインストールされたYARNクラスタ上でPySparkを実行したい場合は、jarを別の場所で構築し、クラスタを超えて出荷することをお勧めします。これについての正確な問題点を調査中です。
YARNのHadoop依存無しのパッケージング
mvn package
で生成されたアセンブリjarは、デフォルトで全てのSparkの配布物、Hadoopおよび幾つかのエコシステムプロジェクトを含むでしょう。YARNデプロイメントでは、これは複数のバージョンがexecutorのクラスパスに現れることを引き起こします; Sparkアセンブリ内にパッケージされているバージョンと各ノード上のバージョン、yarn.application.classpath
に含まれているバージョンです。hadoopが提供する
プロファイルは、ZooKeeperおよびHadoopそれ自身のようなHadoopエコシステムプロジェクトを含むこと無しにアセンブリを構築します。
SBTを使った構築
Maven はSparkのパッケージングのための公式なお勧めのビルドツールです。そしてbuild of referenceです。しかし、SBTは継続的な寄せ集めでもっと高速なので、日々の開発をサポートされます。より進歩的な開発者はSBTを使いたいと思うかも知れません。
SBT ビルドはMaven POMファイルから派生したため、同じMavenプロファイルと変数がSBTビルドを制御するために設定することができます。例えば:
build/sbt -Pyarn -Phadoop-2.3 assembly
毎回sbtを起動するオーバーヘッドを避けるために、再コンパイルする必要があります。build/sbt
を実行することでsbtを対話モードで起動することができ、コマンドプロンプトで全てのビルドコマンドを実行します。ビルド時間の削減についての更なるお勧めは wiki pageを参照してください。
SBTを使ったテスト
幾つかのテストはSparkが最初にパッケージされることを必要とするため、最初にbuild/sbt assembly
を常に実行してください。以下は正しい(ビルド、テスト)の順番の例です:
build/sbt -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver assembly
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 core/test
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
が呼ばれた時はいつでも自動的に再起動されるでしょう。