Sparkのビルド
Apache Sparkのビルド
Apache Maven
Mavenベースのビルドは、Apache Sparkの参照ビルドです。Mavenを使用してSparkをビルドするには、Maven 3.8.8とJava 8/11/17が必要です。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インストールが付属しています。このスクリプトは、必要なすべてのビルド要件(Maven、Scala)をbuild/
ディレクトリ自体にローカルに自動的にダウンロードしてセットアップします。既に存在する場合は、任意のmvn
バイナリを尊重しますが、適切なバージョン要件を満たすために、Scalaの独自のコピーをプルダウンします。build/mvn
の実行は、mvn
呼び出しへのパススルーとして機能し、以前のビルド方法から簡単に移行できます。例として、次のようにSparkのバージョンをビルドできます。
./build/mvn -DskipTests clean package
その他のビルド例は、以下にあります。
実行可能なディストリビューションのビルド
Sparkダウンロードページで配布されているような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
プロファイルを有効にし、yarn.version
プロパティがhadoop.version
と異なる場合は、オプションでyarn.version
プロパティを設定できます。
例
./build/mvn -Pyarn -Dhadoop.version=3.3.0 -DskipTests clean package
HiveおよびJDBCサポート付きのビルド
Spark SQLとそのJDBCサーバーおよびCLIのHive統合を有効にするには、既存のビルドオプションに-Phive
および-Phive-thriftserver
プロファイルを追加します。デフォルトでは、SparkはHive 2.3.9でビルドされます。
# With Hive 2.3.9 support
./build/mvn -Pyarn -Phive -Phive-thriftserver -DskipTests clean package
YARN用のHadoop依存関係なしのパッケージ化
mvn package
によって生成されるアセンブリディレクトリには、デフォルトで、Hadoopとそのエコシステムプロジェクトを含むSparkのすべての依存関係が含まれます。YARNデプロイメントでは、これにより、これらの複数のバージョンがexecutorクラスパスに表示されます。Sparkアセンブリにパッケージ化されたバージョンと、各ノードのバージョン(yarn.application.classpath
に含まれるバージョン)です。hadoop-provided
プロファイルは、ZooKeeperやHadoop自体などのHadoopエコシステムプロジェクトを含めずにアセンブリをビルドします。
Mesosサポート付きのビルド
./build/mvn -Pmesos -DskipTests clean package
Kubernetesサポート付きのビルド
./build/mvn -Pkubernetes -DskipTests clean package
サブモジュールの個別ビルド
mvn -pl
オプションを使用してSparkサブモジュールをビルドできます。
たとえば、次を使用してSpark Streamingモジュールをビルドできます。
./build/mvn -pl :spark-streaming_2.12 clean install
ここで、spark-streaming_2.12
は、streaming/pom.xml
ファイルで定義されているartifactId
です。
Spark Connectサポート付きのビルド
./build/mvn -Pconnect -DskipTests clean package
継続的コンパイル
インクリメンタルおよび継続的なコンパイルをサポートするscala-maven-pluginを使用します。例:
./build/mvn scala:cc
継続的なコンパイル(つまり、変更を待機)を実行する必要があります。ただし、これは広範囲にテストされていません。注意すべきいくつかの落とし穴
-
src/main
およびsrc/test
パスのみをスキャンします(ドキュメントを参照)、そのため、その構造を持つ特定のサブモジュール内からのみ機能します。 -
通常、特定のサブモジュール内でのコンパイルを機能させるには、プロジェクトルートから
mvn install
を実行する必要があります。これは、他のサブモジュールに依存するサブモジュールが、spark-parent
モジュールを介して依存しているためです。
したがって、core
サブモジュールの継続的コンパイルを実行するための完全なフローは、次のようになる可能性があります。
$ ./build/mvn install
$ cd core
$ ../build/mvn scala:cc
SBTによるビルド
Mavenは、Sparkのパッケージ化に推奨される公式のビルドツールであり、参照ビルドです。ただし、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ビルドは「ファイル名が長すぎます」というエラーで失敗する可能性があります。回避策として、プロジェクトの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
valに。これらの行を追加する場所がわからない場合は、このPRも参照してください。
IntelliJ IDEAまたはEclipse
Spark開発のためのIntelliJ IDEAまたはEclipseのセットアップとトラブルシューティングのヘルプについては、便利な開発者ツールページを参照してください。
テストの実行
テストは、デフォルトでScalaTest Mavenプラグインを介して実行されます。テストはrootユーザーまたは管理者ユーザーとして実行しないでください。
以下は、テストを実行するコマンドの例です。
./build/mvn test
SBTによるテスト
以下は、テストを実行するコマンドの例です。
./build/sbt test
個々のテストの実行
個々のテストの実行方法については、便利な開発者ツールページを参照してください。
PySpark pipインストール可能
Python環境で使用するためにSparkをビルドし、pipインストールする場合は、最初に上記のようにSpark JARをビルドする必要があります。次に、setup.pyおよびpipインストール可能なパッケージに適したsdistパッケージを構築できます。
cd python; python setup.py sdist
注:パッケージング要件により、Pythonディレクトリから直接pipインストールすることはできません。代わりに、上記のように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統合テストを実行するには、ボックスに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がサポートされている場合、そのバージョンでビルドできるようになります。(例:2.13)を使用して、メジャーScalaバージョンを変更します。
./dev/change-scala-version.sh 2.13
プロファイルを有効にします(例:2.13)。
# For Maven
./build/mvn -Pscala-2.13 compile
# For 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。 |
IPv6のみの環境でのビルドとテスト
GitHubはまだIPv6をサポートしていないため、Apache Spark GitBox URLを使用してください。
https://gitbox.apache.org/repos/asf/spark.git
IPv6専用環境でビルドおよびテストを実行するには、以下の設定が必要です。
export SPARK_LOCAL_HOSTNAME="your-IPv6-address" # e.g. '[2600:1700:232e:3de0:...]'
export DEFAULT_ARTIFACT_REPOSITORY=https://ipv6.repo1.maven.org/maven2/
export MAVEN_OPTS="-Djava.net.preferIPv6Addresses=true"
export SBT_OPTS="-Djava.net.preferIPv6Addresses=true"
export SERIAL_SBT_TESTS=1
ユーザー定義のprotoc
を使用したビルド
コンパイル環境で公式のprotoc
バイナリファイルを使用してcore
モジュールをビルドできない場合、たとえば、デフォルトのglibc
バージョンが2.14より低いCentOS 6またはCentOS 7でcore
モジュールをコンパイルする場合、以下のようにユーザー定義のprotoc
バイナリファイルを指定してコンパイルおよびテストを試みることができます。
export SPARK_PROTOC_EXEC_PATH=/path-to-protoc-exe
./build/mvn -Puser-defined-protoc -DskipDefaultProtoc clean package
または
export SPARK_PROTOC_EXEC_PATH=/path-to-protoc-exe
./build/sbt -Puser-defined-protoc clean package
ユーザー定義のprotoc
バイナリファイルは、ユーザーのコンパイル環境でソースコードコンパイルによって作成できます。コンパイル手順については、protobufを参照してください。