# 構建 Spark
* [構建 Apache Spark](#構建-apache-spark)
* [Apache Maven](#apache-maven)
* [設置 Maven 的內存使用](#設置-maven-的內存使用)
* [build/mvn](#buildmvn)
* [構建一個可運行的 Distribution 版本](#構建一個可運行的-distribution-版本)
* [指定 Hadoop 版本并啟用 YARN](#指定-hadoop-版本并啟用-yarn)
* [使用 Hive 和 JDBC 支持構建](#使用-hive-和-jdbc-支持構建)
* [打包沒有 Hadoop 依賴關系的 YARN](#打包沒有-hadoop-依賴關系的-yarn)
* [使用 Mesos 構建](#使用-mesos-構建)
* [使用 Scala 2.10 構建](#使用-scala-210-構建)
* [單獨構建子模塊](#單獨構建子模塊)
* [Continuous Compilation(連續編譯)](#continuous-compilation連續編譯)
* [使用 SBT 構建](#使用-sbt-構建)
* [加速編譯](#加速編譯)
* [加密文件系統](#加密文件系統)
* [IntelliJ IDEA 或 Eclipse](#intellij-idea-或-eclipse)
* [運行測試](#運行測試)
* [使用 SBT 測試](#使用-sbt-測試)
* [運行獨立測試](#運行獨立測試)
* [PySpark pip 可安裝](#pyspark-pip-可安裝)
* [使用 Maven 進行 PySpark 測試](#使用-maven-進行-pyspark-測試)
* [運行 R 測試](#運行-r-測試)
* [運行基于 Docker 的集成測試套裝](#運行基于-docker-的集成測試套裝)
# 構建 Apache Spark
## Apache Maven
基于 Maven 的構建是 Apache Spark 的參考構建。構建 Spark 需要 Maven 3.3.9 或者更高版本和 Java 8+。請注意,Spark 2.2.0 對于 Java 7 的支持已經刪除了。
### 設置 Maven 的內存使用
您需要通過設置 `MAVEN_OPTS` 將 Maven 配置為比通常使用更多的內存:
```
export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
```
(`ReservedCodeCacheSize` 設置是可選的,但是建議使用。) 如果您不講這些參數加入到 `MAVEN_OPTS` 中,則可能會看到以下錯誤和警告:
```
[INFO] Compiling 203 Scala sources and 9 Java sources to /Users/me/Development/spark/core/target/scala-2.11/classes...
[ERROR] Java heap space -> [Help 1]
```
您可以通過如前所述設置 `MAVEN_OPTS` 變量來解決這些問題。
**注意:**
* 如果使用 `build/mvn` 但是沒有設置 `MAVEN_OPTS`,那么腳本會自動地將以上選項添加到 `MAVEN_OPTS` 環境變量。
* 即使不適用 `build/mvn`,Spark 構建的 `test` 階段也會自動將這些選項加入到 `MAVEN_OPTS` 中。
### build/mvn
Spark 現在與一個獨立的 Maven 安裝包封裝到了一起,以便從位于 `build/` 目錄下的源代碼構建和部署 Spark。該腳本將自動下載并設置所有必要的構建需求([Maven](https://maven.apache.org/),[Scala](http://www.scala-lang.org/) 和 [Zinc](https://github.com/typesafehub/zinc))到本身的 `build/` 目錄下。其尊重任何已經存在的 `mvn` 二進制文件,但是將會 pull down 其自己的 Scala 和 Zinc 的副本,不管是否滿足適當的版本需求。`build/mvn` 的執行作為傳遞到 `mvn` 的調用,允許從以前的構建方法輕松轉換。例如,可以像下邊這樣構建 Spark 的版本:
```
./build/mvn -DskipTests clean package
```
其他的構建例子可以在下邊找到。
## 構建一個可運行的 Distribution 版本
想要創建一個像 [Spark 下載](http://spark.apache.org/downloads.html) 頁面中的 Spark distribution 版本,并且使其能夠運行,請使用項目 root 目錄下的 `./dev/make-distribution.sh`。它可以使用 Maven 的配置文件等等進行配置,如直接使用 Maven 構建。例如:
```
./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Psparkr -Phadoop-2.7 -Phive -Phive-thriftserver -Pmesos -Pyarn
```
這將構建 Spark distribution 以及 Python pip 和 R 包。有關使用情況的更多信息,請運行 `./dev/make-distribution.sh --help`
## 指定 Hadoop 版本并啟用 YARN
您可以通過 `hadoop.version` 屬性指定要編譯的 Hadoop 的確切版本。如果未指定,Spark 將默認構建為 Hadoop 2.6.X。
您可以啟用 `yarn` 配置文件,如果與 `hadoop.version` 不同的話,可以選擇設置 `yarn.version` 屬性。
示例:
```
# Apache Hadoop 2.6.X
./build/mvn -Pyarn -DskipTests clean package
# Apache Hadoop 2.7.X and later
./build/mvn -Pyarn -Phadoop-2.7 -Dhadoop.version=2.7.3 -DskipTests clean package
```
## 使用 Hive 和 JDBC 支持構建
要啟用 Spark SQL 及其 JDBC server 和 CLI 的 Hive 集成,將 `-Phive` 和 `Phive-thriftserver` 配置文件添加到現有的構建選項中。默認情況下,Spark 將使用 Hive 1.2.1 綁定構建。
```
# With Hive 1.2.1 support
./build/mvn -Pyarn -Phive -Phive-thriftserver -DskipTests clean package
```
## 打包沒有 Hadoop 依賴關系的 YARN
默認情況下,由 `mvn package` 生成的 assembly directory(組件目錄)將包含所有的Spark 依賴,包括 Hadoop 及其一些生態系統項目。在 YARN 部署中,導致這些的多個版本顯示在執行器 classpaths 上: Spark 組件的打包的版本和每個節點上的版本,包含在 `yarn.application.classpath` 中。`hadoop-provided` 配置文件構建了不包括 Hadoop 生態系統項目的組件,就像 ZooKeeper 和 Hadoop 本身。
## 使用 Mesos 構建
```
./build/mvn -Pmesos -DskipTests clean package
```
## 使用 Scala 2.10 構建
要使用 Scala 2.10 編譯的 Spark 軟件包,請使用 `-Dscala-2.10` 屬性:
```
./dev/change-scala-version.sh 2.10
./build/mvn -Pyarn -Dscala-2.10 -DskipTests clean package
```
請注意,Scala 2.10 的支持已經不再適用于 Spark 2.1.0,并且可能在 Spark 2.2.0 中被刪除。
## 單獨構建子模塊
可以使用 `mvn -pl` 選項來構建 Spark 的子模塊。
例如,您可以使用下面打代碼來構建 Spark Streaming 模塊:
```
./build/mvn -pl :spark-streaming_2.11 clean install
```
其中 `spark-streaming_2.11` 是在 `streaming/pom.xml` 文件中定義的 `artifactId`。
## Continuous Compilation(連續編譯)
我們使用支持增量和連續編譯的 scala-maven-plugin 插件。例如:
```
./build/mvn scala:cc
```
這里應該運行連續編譯(即等待更改)。然而這并沒有得到廣泛的測試。有幾個需要注意的事情:
* 它只掃描路徑 `src/main` 和 `src/test`(查看 [docs](http://scala-tools.org/mvnsites/maven-scala-plugin/usage_cc.html)),所以其只對含有該結構的某些子模塊起作用。
* 您通常需要在工程的根目錄運行 `mvn install` 在編譯某些特定子模塊時。這是因為依賴于其他子模塊的子模塊需要通過 `spark-parent` 模塊實現。
因此,運行 `core` 子模塊的連續編譯總流程會像下邊這樣:
```
$ ./build/mvn install
$ cd core
$ ../build/mvn scala:cc
```
## 使用 SBT 構建
Maven 是推薦用于打包 Spark 的官方構建工具,是 _build of reference_。但是 SBT 支持日常開發,因為它可以提供更快的迭代編譯。更多高級的開發者可能希望使用 SBT。SBT 構建是從 Maven POM 文件導出的,因此也是相同的 Maven 配置文件和變量可以設置來控制 SBT 構建。例如:
```
./build/sbt package
```
為了避免在每次需要重新編譯時啟動 sbt 的開銷,可以啟動 sbt 在交互模式下運行 `build/sbt`,然后在命令中運行所有構建命令提示。
## 加速編譯
經常編譯 Spark 的開發人員可能希望加快編譯速度; 例如通過使用 Zinc(對于使用 Maven 構建的開發人員)或避免重新編譯組件 JAR(對于使用 SBT 構建的開發人員)。有關如何執行此操作的更多信息,請參閱 [有用的開發工具頁面](http://spark.apache.org/developer-tools.html#reducing-build-times)。
## 加密文件系統
當在加密文件系統上構建時(例如,如果您的 home 目錄是加密的),則 Spark 構建可能會失敗,并導致 “Filename too long” 錯誤。作為解決方法,在項目 `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。如果您不確定添加這些行的位置,請參閱 [this PR](https://github.com/apache/spark/pull/2883/files)。
## IntelliJ IDEA 或 Eclipse
有關設置 IntelliJ IDEA 或 Eclipse 用于 Spark 開發和故障排除的幫助,請參閱 [有用的開發工具頁面](http://spark.apache.org/developer-tools.html)。
# 運行測試
默認情況下通過 [ScalaTest Maven plugin](http://www.scalatest.org/user_guide/using_the_scalatest_maven_plugin) 進行測試。請注意,測試不應該以 root 用戶或者 admin 用戶運行。
以下是運行測試的命令示例:
```
./build/mvn test
```
## 使用 SBT 測試
以下是運行測試的命令示例:
```
./build/sbt test
```
## 運行獨立測試
有關如何運行獨立測試的信息,請參閱 [有用的開發工具頁面](http://spark.apache.org/developer-tools.html#running-individual-tests)。
## PySpark pip 可安裝
如果您正在構建 Spark 以在 Python 環境中使用,并且希望對其進行 pip 安裝,那么您將首先需要如上所述構建 Spark JARs。然后,您可以構建適合于 setup.py 和 pip 可安裝軟件包的 sdist 軟件包。
```
cd python; python setup.py sdist
```
**注意:** 由于打包要求,您無法直接從 Python 目錄中進行 pip 安裝,而是必須首先按照上述方式構建 sdist 包。
或者,您還可以使用 –pip 選項運行 make-distribution。
## 使用 Maven 進行 PySpark 測試
如果您正在構建 PySpark 并希望運行 PySpark 測試,則需要使用 Hive 支持構建 Spark。
```
./build/mvn -DskipTests clean package -Phive
./python/run-tests
```
run-tests 腳本也可以限于特定的 Python 版本或者特定的模塊。
```
./python/run-tests --python-executables=python --modules=pyspark-sql
```
**注意:** 您還可以使用 sbt 構建來運行 Python 測試,只要您使用 Hive 支持構建 Spark。
## 運行 R 測試
要運行 SparkR 測試,您需要首先安裝 [knitr](https://cran.r-project.org/package=knitr),[rmarkdown](https://cran.r-project.org/package=rmarkdown),[testthat](https://cran.r-project.org/package=testthat),[e1071](https://cran.r-project.org/package=e1071) and [survival](https://cran.r-project.org/package=survival) 包:
```
R -e "install.packages(c('knitr', 'rmarkdown', 'testthat', 'e1071', 'survival'), repos='http://cran.us.r-project.org')"
```
您可以使用以下命令只運行 SparkR 測試:
```
./R/run-tests.sh
```
## 運行基于 Docker 的集成測試套裝
為了運行 Docker 集成測試,你必須在你的 box 上安裝 `docker` engine(引擎)。有關安裝說明,請參見 [Docker 站點](https://docs.docker.com/engine/installation/)。一旦安裝,如果還沒有運行 Docker 服務,`docker` service 就需要啟動。在 Linux 上,這可以通過 `sudo service docker start` 來完成。
```
./build/mvn install -DskipTests
./build/mvn test -Pdocker-integration-tests -pl :spark-docker-integration-tests_2.11
```
或者
```
./build/sbt docker-integration-tests/test
```
- Spark 概述
- 編程指南
- 快速入門
- Spark 編程指南
- 構建在 Spark 之上的模塊
- Spark Streaming 編程指南
- Spark SQL, DataFrames and Datasets Guide
- MLlib
- GraphX Programming Guide
- API 文檔
- 部署指南
- 集群模式概述
- Submitting Applications
- 部署模式
- Spark Standalone Mode
- 在 Mesos 上運行 Spark
- Running Spark on YARN
- 其它
- 更多
- Spark 配置
- Monitoring and Instrumentation
- Tuning Spark
- 作業調度
- Spark 安全
- 硬件配置
- Accessing OpenStack Swift from Spark
- 構建 Spark
- 其它
- 外部資源
- Spark RDD(Resilient Distributed Datasets)論文
- 翻譯進度