构建 Spark
构建 Apache Spark
Apache Maven
基于 Maven 的构建是 Apache Spark 的参考构建。使用 Maven 构建 Spark 需要 Maven 3.9.6 和 Java 8/11/17。Spark 需要 Scala 2.12/2.13;Spark 3.0.0 中移除了对 Scala 2.11 的支持。
设置 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
且未设置MAVEN_OPTS
,该脚本将自动将上述选项添加到MAVEN_OPTS
环境变量。 - Spark 构建的
test
阶段会自动将这些选项添加到MAVEN_OPTS
,即使不使用build/mvn
。
build/mvn
Spark 现在附带了一个独立的 Maven 安装包,以便于从位于 build/
目录下的源代码构建和部署 Spark。 此脚本将自动下载并在本地 build/
目录中设置所有必需的构建要求(Maven,Scala)。 如果已经存在任何 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
配置文件,并且如果它与 hadoop.version
不同,可以选择设置 yarn.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
打包没有 Hadoop 依赖项的 YARN
默认情况下,mvn package
生成的程序集目录将包括 Spark 的所有依赖项,包括 Hadoop 及其一些生态系统项目。 在 YARN 部署上,这会导致这些项目的多个版本出现在 executor 类路径上: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
应该运行持续编译(即等待更改)。 但是,尚未对此进行广泛测试。 需要注意几个问题
-
它仅扫描
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。 然后,您可以构建适合 setup.py 的 sdist 包以及可通过 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)时,可以为该版本构建。 使用以下命令更改主要的 Scala 版本(例如 2.13)
./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。