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変数を設定することで解決できます。

注意

build/mvn

Sparkには、ビルドとSparkのソースからのデプロイメントを容易にするために、build/ディレクトリの下に自己完結型のMavenインストールがパッケージ化されています。このスクリプトは、必要なビルド要件(MavenScala)を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.13streaming/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

継続的コンパイル(つまり、変更を待機)を実行します。ただし、これは広範なテストは行われていません。注意すべき点がいくつかあります。

したがって、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.xmlscala-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テストを実行するには、まずknitrrmarkdowntestthate1071、および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を参照してください。