Sparkのビルド
Apache Sparkのビルド
Apache Maven
MavenベースのビルドはApache Sparkのリファレンスビルドです。Mavenを使用してSparkをビルドするには、Maven 3.9.9およびJava 17/21が必要です。SparkはScala 2.13を必要とします。Spark 4.0.0でScala 2.12のサポートは削除されました。
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.13/classes...
[ERROR] Java heap space -> [Help 1]
これらの問題は、前述のようにMAVEN_OPTS変数を設定することで解決できます。
注意
MAVEN_OPTSが設定されていないbuild/mvnを使用する場合、スクリプトは自動的に上記のオプションをMAVEN_OPTS環境変数に追加します。- Sparkのビルドの
testフェーズでは、build/mvnを使用していない場合でも、これらのオプションが自動的にMAVEN_OPTSに追加されます。
build/mvn
Sparkには、ビルドとSparkのソースからのデプロイメントを容易にするために、build/ディレクトリの下に自己完結型のMavenインストールがパッケージ化されています。このスクリプトは、必要なビルド要件(Maven、Scala)をbuild/ディレクトリ内にローカルで自動的にダウンロードしてセットアップします。既存のmvnバイナリがあればそれを尊重しますが、適切なバージョンの要件を満たすために独自のScalaコピーをダウンロードします。build/mvnの実行は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 -Pyarn -Pkubernetes
これにより、Python pipおよびRパッケージとともにSparkディストリビューションがビルドされます。使用方法の詳細については、./dev/make-distribution.sh --helpを実行してください。
Hadoopバージョンの指定とYARNの有効化
yarnプロファイルと、hadoop.versionプロパティを介してコンパイル対象のHadoopの正確なバージョンを指定することで、有効化できます。
例
./build/mvn -Pyarn -Dhadoop.version=3.4.1 -DskipTests clean package
HiveおよびJDBCサポート付きのビルド
Spark SQLのHive統合とそのJDBCサーバーおよびCLIを有効にするには、既存のビルドオプションに-Phiveおよび-Phive-thriftserverプロファイルを追加します。デフォルトでは、SparkはHive 2.3.10でビルドされます。
# With Hive 2.3.10 support
./build/mvn -Pyarn -Phive -Phive-thriftserver -DskipTests clean package
YARN用のHadoop依存関係なしのパッケージング
mvn packageによって生成されるアセンブリディレクトリには、デフォルトで、Hadoopおよびそのエコシステムプロジェクトを含むSparkのすべての依存関係が含まれます。YARNデプロイメントでは、これにより、Sparkアセンブリにパッケージ化されたバージョンと、各ノードのyarn.application.classpathに含まれるバージョンという、これらの複数のバージョンがエグゼキュータクラスパスに表示されます。hadoop-providedプロファイルは、ZooKeeperやHadoop自体などのHadoopエコシステムプロジェクトを含めずにアセンブリをビルドします。
Kubernetesサポート付きのビルド
./build/mvn -Pkubernetes -DskipTests clean package
サブモジュールの個別ビルド
mvn -plオプションを使用して、Sparkサブモジュールをビルドすることが可能です。
例えば、Spark Streamingモジュールは以下のようにビルドできます。
./build/mvn -pl :spark-streaming_2.13 clean install
ここで、spark-streaming_2.13はstreaming/pom.xmlファイルで定義されているartifactIdです。
JVMプロファイルサポート付きのビルド
./build/mvn -Pjvm-profiler -DskipTests clean package
注意:jvm-profilerプロファイルは、依存関係ap-loaderを含めずにアセンブリをビルドします。これは、Maven Centralリポジトリから手動でダウンロードし、spark-profiler_2.13と組み合わせて使用できます。
継続的コンパイル
インクリメンタルおよび継続的コンパイルをサポートする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のメモリ使用量の設定
SBTのJVMオプションは、プロジェクトルートの.jvmoptsで構成します。例:
-Xmx2g
-XX:ReservedCodeCacheSize=1g
これらの2つのオプションの意味については、Mavenのメモリ使用量の設定セクションをよくお読みください。
コンパイルの高速化
頻繁にSparkをコンパイルする開発者は、コンパイルを高速化したい場合があります。例えば、アセンブリJARの再コンパイルを回避することで(SBTでビルドする開発者向け)。これを行う方法の詳細については、便利な開発者ツールページを参照してください。
暗号化されたファイルシステム
暗号化されたファイルシステム(例えば、ホームディレクトリが暗号化されている場合)でビルドする場合、「Filename too long」エラーで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
IntelliJ IDEAまたはEclipseをSpark開発用に設定すること、およびトラブルシューティングについては、便利な開発者ツールページを参照してください。
テストの実行
テストはデフォルトでScalaTest Mavenプラグインを介して実行されます。テストはrootまたは管理者ユーザーとしては実行しないでください。
テストを実行するためのコマンドの例を以下に示します。
./build/mvn test
SBTでのテスト実行
テストを実行するためのコマンドの例を以下に示します。
./build/sbt test
個別のテスト実行
個別のテストを実行する方法については、便利な開発者ツールページを参照してください。
PySpark pip インストール可能
Python環境で使用するためにSparkをビルドし、pipでインストールしたい場合は、まず上記のようにSpark JARをビルドする必要があります。その後、setup.pyに適したsdistパッケージを構築し、pipでインストール可能なパッケージを作成できます。
cd python; python packaging/classic/setup.py sdist
注意:パッケージングの要件のため、Pythonディレクトリから直接pipインストールすることはできません。代わりに、まず上記で説明したようにsdistパッケージをビルドする必要があります。
または、--pipオプションを指定してmake-distribution.shを実行することもできます。
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.13
または
./build/sbt docker-integration-tests/test
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でのビルド
ユーザーがコンパイル環境でcoreモジュールをビルドするために公式のprotocバイナリファイルを使用できない場合(例えば、デフォルトの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を参照してください。