建立 Spark

建立 Apache Spark

Apache Maven

基於 Maven 的建立是 Apache Spark 的參考建立。使用 Maven 建立 Spark 需要 Maven 3.8.8 和 Java 8/11/17。Spark 需要 Scala 2.12/2.13;Spark 3.0.0 已移除對 Scala 2.11 的支援。

設定 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 現在隨附獨立的 Maven 安裝,以簡化從位於 build/ 目錄下的來源建立和部署 Spark。此指令碼會自動下載並設定所有必要的建立需求 (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

這將建置 Spark 散發版本,以及 Python pip 和 R 套件。如需使用方式的詳細資訊,請執行 ./dev/make-distribution.sh --help

指定 Hadoop 版本並啟用 YARN

您可以透過 hadoop.version 屬性指定要編譯的 Hadoop 確切版本。

您可以啟用 yarn 設定檔,並選擇性地設定 yarn.version 屬性,如果它與 hadoop.version 不同。

範例

./build/mvn -Pyarn -Dhadoop.version=3.3.0 -DskipTests clean package

使用 Hive 和 JDBC 支援進行建立

若要啟用 Spark SQL 的 Hive 整合,以及其 JDBC 伺服器和 CLI,請將 -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 產生的組裝目錄預設會包含所有 Spark 的相依性,包括 Hadoop 和一些生態系專案。在 YARN 部署中,這會導致這些相依性在執行器類別路徑中出現多個版本:Spark 組裝中封裝的版本,以及每個節點中包含 yarn.application.classpath 的版本。hadoop-provided 設定檔會建置組裝,但不包含 Hadoop 生態系專案,例如 ZooKeeper 和 Hadoop 本身。

使用 Mesos 支援進行建立

./build/mvn -Pmesos -DskipTests clean package

使用 Kubernetes 支援進行建立

./build/mvn -Pkubernetes -DskipTests clean package

個別建立子模組

可以使用 mvn -pl 選項建置 Spark 子模組。

例如,您可以使用下列方式建置 Spark 串流模組

./build/mvn -pl :spark-streaming_2.12 clean install

其中 spark-streaming_2.12streaming/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

有關這兩個選項的意義,請仔細閱讀 設定 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

有關設定 IntelliJ IDEA 或 Eclipse 以進行 Spark 開發和疑難排解的說明,請參閱 有用的開發人員工具頁面

執行測試

預設會透過 ScalaTest Maven 外掛程式執行測試。請注意,不應以 root 或管理員身分執行測試。

以下是一個執行測試的指令範例

./build/mvn test

使用 SBT 進行測試

以下是一個執行測試的指令範例

./build/sbt test

執行個別測試

有關如何執行個別測試的資訊,請參閱 有用的開發人員工具頁面

可安裝 PySpark pip

如果您要建置 Spark 以在 Python 環境中使用,而且您希望使用 pip 安裝它,您首先需要如上所述建置 Spark JAR。然後您可以建置一個 sdist 套件,以便於 setup.py 和 pip 安裝套件。

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 測試,您需要先安裝 knitrrmarkdowntestthate1071survival 套件

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 版本

當支援其他版本的 Scala,例如 2.13 時,將可以建置該版本。使用 (例如 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 的環境中建立和測試

使用 Apache Spark GitBox URL,因為 GitHub 尚未支援 IPv6。

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 模組,例如在 CentOS 6 或 CentOS 7 上編譯 core 模組,其預設 glibc 版本低於 2.14,我們可以嘗試指定使用者定義的 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