构建 Spark

构建 Apache Spark

Apache Maven

基于 Maven 的构建是 Apache Spark 的参考构建。使用 Maven 构建 Spark 需要 Maven 3.8.8 和 Java 8/11/17。Spark 需要 Scala 2.12/2.13;对 Scala 2.11 的支持已在 Spark 3.0.0 中移除。

设置 Maven 的内存使用量

您需要配置 Maven 以使用比平时更多的内存,方法是设置 MAVEN_OPTS

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 Streaming 模块:

./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

应该运行持续编译(即等待更改)。但是,这尚未经过广泛测试。需要注意的是,有一些问题

因此,运行 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

有关为 Spark 开发设置 IntelliJ IDEA 或 Eclipse 以及故障排除的帮助,请参阅 有用的开发人员工具页面

运行测试

测试默认情况下通过 ScalaTest Maven 插件 运行。请注意,测试不应以 root 或管理员用户身份运行。

以下是如何运行测试的示例命令

./build/mvn test

使用 SBT 进行测试

以下是如何运行测试的示例命令

./build/sbt test

运行单个测试

有关如何运行单个测试的信息,请参阅 有用的开发人员工具页面

PySpark pip 可安装

如果您正在构建 Spark 以在 Python 环境中使用,并且希望使用 pip 安装它,则首先需要按上述说明构建 Spark JAR。然后,您可以构建适合 setup.py 和 pip 可安装包的 sdist 包。

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 模块时,例如,在默认 glibc 版本低于 2.14 的 CentOS 6 或 CentOS 7 上编译 core 模块,我们可以尝试通过指定用户定义的 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