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

build/mvn

Sparkには、build/ディレクトリにあるソースからSparkのビルドとデプロイを容易にするための自己完結型のMavenインストールが付属しています。このスクリプトは、必要なすべてのビルド要件(MavenScala)を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

継続的なコンパイル(つまり、変更を待機)を実行する必要があります。ただし、これは広範囲にテストされていません。注意すべきいくつかの落とし穴

したがって、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テストを実行するには、最初に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.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を参照してください。