Apache Maven
基於 Maven 的構建是 Apache Spark 的參考構建。使用 Maven 構建 Spark 需要 Maven 3.3.9或更新版本和 Java 7+。
注意,從Spark 2.0.0開始,對Java 7的支持就被廢棄了,可能在Spark 2.2.0中被刪除。
Setting up Maven’s Memory Usage
你需要通過設置 MAVEN_OPTS 來配置Maven來使用更多的內存:
export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
在使用 Java 7進行編譯時,您需要向 MAVEN_OPTS 添加附加選項“-XX:MaxPermSize=512M”。
如果您不將這些參數添加到 MAVEN_OPTS 中,您可能會看到以下錯誤和警告:
[INFO] Compiling 203 Scala sources and 9 Java sources to /Users/me/Development/spark/core/target/scala-2.11/classes...
[ERROR] PermGen space -> [Help 1]
[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]
[INFO] Compiling 233 Scala sources and 41 Java sources to /Users/me/Development/spark/sql/core/target/scala-{site.SCALA_BINARY_VERSION}/classes...
OpenJDK 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled.
OpenJDK 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize=
如前所述,可以通過設置 MAVEN_OPTS 變量來修復這些問題。
Note:
- 如果使用未設置 MAVEN_OPTS 的 build/mvn,腳本將自動將上述選項添加到 MAVEN_OPTS 環境變量中。
- 即使在不使用 build/mvn 的情況下,Spark 構建的測試階段也會自動將這些選項添加到 MAVEN_OPTS 中。
- 當使用Java 8和build/mvn構建或運行測試時,你可能看到像這樣的警告:“ignoring option MaxPermSize=1g; support was removed in 8.0”。這些警告可以忽略。
build/mvn
Spark 現在附帶了一個自包含的 Maven 安裝,簡化了從 build/目錄下的源代碼構建和部署 Spark 的過程。該腳本將在本地的build/目錄中自動下載並設置所有必要的構建需求(Maven、Scala和Zinc)。但是,如果已經存在任何 mvn 二進制文件,那麼它將使用自己的 Scala 和 Zinc 副本,以確保滿足適當的版本要求。build/mvn 執行充當到 mvn 調用的通道,允許輕鬆地從以前的構建方法轉換。舉個例子,你可以建立一個版本的 spark 如下:
./build/mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -DskipTests clean package
其他構建示例可以在下面找到。
構建可運行的發行版
要創建一個類似於Spark下載頁面發佈的Spark發行版,並將其佈局爲可運行,請在項目根目錄中使用./dev/make-distribution.sh。它可以使用Maven配置文件設置等進行配置,比如直接以 Maven 構建。例子:
./dev/make-distribution.sh --name custom-spark --tgz -Psparkr -Phadoop-2.4 -Phive -Phive-thriftserver -Pmesos -Pyarn
有關使用的更多信息,請運行./dev/make-distribution.sh --help
指定Hadoop版本
因爲 HDFS 在不同的版本之間不是協議兼容的,如果您想從 HDFS 讀取數據,那麼您需要針對環境中的特定 HDFS 版本構建Spark。您可以通過 hadoop.version 實現這一點。如果未設置,Spark 將默認針對 Hadoop 2.2.0構建。注意,特定的 Hadoop 版本需要特定的構建配置文件:
Hadoop version | Profile required |
---|---|
2.2.x | hadoop-2.2 |
2.3.x | hadoop-2.3 |
2.4.x | hadoop-2.4 |
2.6.x | hadoop-2.6 |
2.7.x and later 2.x | hadoop-2.7 |
注意,在 Spark 2.1.0中已經不支持2.6之前的 Hadoop 版本,在 Spark 2.2.0中可能會刪除。
你可以啓用 yarn 的配置文件設置 yarn.version,如果 hadoop.version 的版本不同。Saprk 支持 yarn 2.2.0 及以上的版本。
例如:
# Apache Hadoop 2.2.X
./build/mvn -Pyarn -Phadoop-2.2 -DskipTests clean package
# Apache Hadoop 2.3.X
./build/mvn -Pyarn -Phadoop-2.3 -Dhadoop.version=2.3.0 -DskipTests clean package
# Apache Hadoop 2.4.X or 2.5.X
./build/mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -DskipTests clean package
# Apache Hadoop 2.6.X
./build/mvn -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0 -DskipTests clean package
# Apache Hadoop 2.7.X and later
./build/mvn -Pyarn -Phadoop-2.7 -Dhadoop.version=2.7.0 -DskipTests clean package
# Different versions of HDFS and YARN.
./build/mvn -Pyarn -Phadoop-2.3 -Dhadoop.version=2.3.0 -Dyarn.version=2.2.0 -DskipTests clean package
使用Hive和JDBC支持構建
要爲 Spark SQL 及其 JDBC 服務器和 CLI 啓用 Hive 集成,請將 -Phive 和 Phive-thriftserver 配置文件添加到現有的構建選項中。默認情況下,Spark 將使用 Hive 1.2.1綁定構建。
# Apache Hadoop 2.4.X with Hive 1.2.1 support
./build/mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -Phive -Phive-thriftserver -DskipTests clean package
不依賴Hadoop打包紗線
默認情況下,mvn 包生成的彙編目錄將包括 Spark 的所有依賴項,包括 Hadoop 和它的一些生態系統項目。在部署 yarn 時,這會導致多個版本的代碼出現在 executor 類路徑上:打包在Spark程序集中的版本和每個節點上的版本,包括在 yarn.application.classpath中。
Hadoop 提供的配置文件構建了集合,但沒有包括 Hadoop 生態系統項目,比如ZooKeeper和Hadoop本身。
使用Mesos支持進行構建
./build/mvn -Pmesos -DskipTests clean package
Building for Scala 2.10
要生成用Scala 2.10編譯的Spark包,請使用-Dscala-2.10屬性:
./dev/change-scala-version.sh 2.10
./build/mvn -Pyarn -Phadoop-2.4 -Dscala-2.10 -DskipTests clean package
請注意,從 Spark 2.1.0開始就不支持 Scala 2.10,在 Spark 2.2.0中可能會刪除它。
分別構建子組件
可以使用mvn -pl選項構建Spark子模塊。
例如,你可以構建Spark流模塊:
./build/mvn -pl :spark-streaming_2.11 clean install
其中 spark-streaming_2.11 是流/pom.xml文件中定義的 artifactId。
持續編譯
我們使用scala-maven-plugin,它支持增量和連續編譯。如:
./build/mvn scala:cc
應該運行連續編譯(即等待更改)。然而,這還沒有經過充分的測試。以下是需要注意的幾個問題:
- 它只掃描src/main和src/test路徑(請參閱文檔),因此它只在具有該結構的特定子模塊中運行。
- 您通常需要從項目根目錄運行 mvn 安裝,以便在特定的子模塊中進行編譯;這是因爲依賴於其他子模塊的子模塊是通過 spark-parent 模塊實現的)。
因此,運行核心子模塊的連續編譯的完整流程可能看起來更像:
$ ./build/mvn install
$ cd core
$ ../build/mvn scala:cc
加快Zinc 的編譯
Zinc 是 SBT 增量編譯器的一個長時間運行的服務器版本。當作爲後臺進程在本地運行時,它會加速基於 scala 的項目(如Spark)的構建。經常使用 Maven 重新編譯Spark的開發人員將對Zinc最感興趣。項目現場提供 Zinc 的建造和使用說明;OS X用戶可以使用 brew install zinc 來安裝它。
如果使用 build/mvn包,Zinc 將自動下載並用於所有構建。除非設置了 ZINC_PORT 環境變量,否則該進程將在第一次調用 build/mvn 後自動啓動並綁定到3030端口。隨後,可以通過運行 build/zinc-<version>/bin/zinc -shutdown隨時關閉zinc進程,並在調用 build/mvn 時自動重啓。
通過SBT構建
Maven 是打包 Spark 推薦的官方構建工具,是參考的構建。但是SBT支持日常開發,因爲它可以提供更快的迭代編譯。更高級的開發人員可能希望使用SBT。
SBT構建源自Maven POM文件,因此可以設置相同的Maven配置文件和變量來控制SBT構建。例如:
./build/sbt -Pyarn -Phadoop-2.3 package
爲了避免每次需要重新編譯時啓動sbt的開銷,可以通過運行 build/sbt 在交互模式下啓動sbt,然後在命令提示符下運行所有構建命令。
加密文件系統
在加密的文件系統上構建時(例如,如果您的主目錄是加密的),那麼 Spark 構建可能會失敗,出現“Filename too long”錯誤。作爲一種變通方法,在project pom.xml中的 scala-maven-plugin 配置參數中添加以下內容:
<arg>-Xmax-classfile-name</arg>
<arg>128</arg>
在 project/SparkBuild.scala 中添加:
scalacOptions in Compile ++= Seq("-Xmax-classfile-name", "128"),
IntelliJ IDEA or Eclipse
http://spark.apache.org/developer-tools.html
Running Tests
測試默認通過 ScalaTest Maven 插件運行。
注意,測試不應該作爲根用戶或管理用戶運行。
下面是一個運行測試的命令示例:
./build/mvn -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver test
ScalaTest插件還支持只運行特定的Scala測試套件,如下所示:
./build/mvn -P... -Dtest=none -DwildcardSuites=org.apache.spark.repl.ReplSuite test
./build/mvn -P... -Dtest=none -DwildcardSuites=org.apache.spark.repl.* test
或者 java
./build/mvn test -P... -DwildcardSuites=none -Dtest=org.apache.spark.streaming.JavaAPISuite
Testing with SBT
下面是一個運行測試的命令示例:
./build/sbt -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver test
只運行一個特定的測試套件,如下:
./build/sbt -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver "test-only org.apache.spark.repl.ReplSuite"
./build/sbt -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver "test-only org.apache.spark.repl.*"
運行測試套件的具體子項目如下:
./build/sbt -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver core/test
運行Java 8測試套件
只運行Java 8測試,其他什麼都不運行。
./build/mvn install -DskipTests
./build/mvn -pl :java8-tests_2.11 test
或者
./build/sbt java8-tests/test
當檢測到 Java 8 JDK時,將自動啓用 Java 8測試。如果安裝了 JDK 8,但它不是系統默認設置,那麼可以將 JAVA_HOME 設置爲在運行測試之前指向 JDK 8。
PySpark pip安裝
如果您正在構建用於Python環境的Spark,並且希望pip安裝它,那麼首先需要像上面描述的那樣構建Spark jar。然後您可以構造一個適合setup.py和pip可安裝包的sdist包。
cd python; python setup.py sdist
注意:由於打包要求,您不能直接從Python目錄進行pip安裝,而是必須首先按照上面所述構建sdist包。
使用Maven進行PySpark測試
如果您正在構建 PySpark,並希望運行 PySpark 測試,您將需要構建支持 Hive 的 Spark。
./build/mvn -DskipTests clean package -Phive
./python/run-tests
運行測試腳本也可以限制在特定的Python版本或特定的模塊中
./python/run-tests --python-executables=python --modules=pyspark-sql
注意:您還可以使用sbt構建運行Python測試,前提是您使用Hive支持構建Spark。
運行R測試
要運行 SparkR 測試,您需要安裝R包testthat(從R shell運行install.packages(testthat))。你可以使用以下命令運行SparkR測試:
./R/run-tests.sh
運行基於docker的集成測試套件
爲了運行 Docker 集成測試,您必須在機器上安裝 Docker 引擎。安裝說明可以在 Docker 站點找到。安裝之後,如果還沒有運行docker服務,則需要啓動它。在Linux上,這可以由sudo服務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