Building Spark(重新構建編譯Spark)

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

 

原文地址:http://spark.apache.org/docs/2.1.1/building-spark.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章