建立 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
變數來修正這些問題,如前述所討論。
注意事項
- 如果在未設定
MAVEN_OPTS
的情況下使用build/mvn
,指令碼會自動將上述選項新增至MAVEN_OPTS
環境變數。 - Spark 建立的
test
階段會自動將這些選項新增至MAVEN_OPTS
,即使未使用build/mvn
也是如此。
build/mvn
Spark 現在隨附獨立的 Maven 安裝,以簡化從位於 build/
目錄下的來源建立和部署 Spark。此指令碼會自動下載並設定所有必要的建立需求 (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
這將建置 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.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
有關這兩個選項的意義,請仔細閱讀 設定 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 測試,您需要先安裝 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 版本
當支援其他版本的 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。