构建Spark
构建 Apache Spark
Apache Maven
基于Maven的构建是Apache Spark的参考构建。 使用Maven构建Spark需要Maven 3.9.6和Java 8/11/17。 Spark需要Scala 2.12/2.13;对Scala 2.11的支持在Spark 3.0.0中被移除。
配置 Maven 的内存使用
您需要通过设置
MAVEN_OPTS
来配置 Maven 以使用比通常更多的内存:
export MAVEN_OPTS="-Xss64m -Xmx2g -XX:ReservedCodeCacheSize=1g"
(
ReservedCodeCacheSize
设置是可选的,但建议使用。)
如果您没有将这些参数添加到
MAVEN_OPTS
中,您可能会看到如下错误和警告:
[INFO] 正在编译 203 个 Scala 源文件和 9 个 Java 源文件到 /Users/me/Development/spark/core/target/scala-2.12/classes...
[ERROR] Java 堆空间不足 -> [Help 1]
您可以通过设置
MAVEN_OPTS
变量来修复这些问题,如前所述。
注意:
-
如果使用
build/mvn
而没有设置MAVEN_OPTS
,脚本将自动将上述选项添加到MAVEN_OPTS
环境变量中。 -
Spark 构建的
test
阶段将自动将这些选项添加到MAVEN_OPTS
,即使不使用build/mvn
。
构建/mvn
Spark 现在配备了一个自包含的 Maven 安装,以便于从位于
build/
目录下的源代码构建和部署 Spark。这个脚本将自动下载并设置所有必要的构建要求(
Maven
,
Scala
),并将其本地存放在
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与其JDBC服务器和CLI的Hive集成,添加
-Phive
和
-Phive-thriftserver
配置到您现有的构建选项中。默认情况下,Spark将与Hive 2.3.9构建。
# 支持 Hive 2.3.9
./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 清理 打包
使用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 打包
为了避免每次需要重新编译时启动sbt的开销,您可以通过运行
build/sbt
以交互模式启动sbt,然后在命令提示符下运行所有构建命令。
设置 SBT 的内存使用情况
在项目根目录的
.jvmopts
中配置 SBT 的 JVM 选项,例如:
-Xmx2g
-XX:ReservedCodeCacheSize=1g
有关这两个选项的含义,请仔细阅读 设置 Maven 的内存使用部分 .
加快编译速度
经常编译Spark的开发者可能希望加快编译速度;例如,通过避免重新编译 assembly JAR(对于使用SBT构建的开发者)。有关如何实现这一点的更多信息,请参考 有用的开发者工具页面 。
加密文件系统
当在加密文件系统上构建时(例如,如果您的主目录是加密的),那么 Spark 构建可能会因“文件名过长”错误而失败。作为解决方法,请在项目
pom.xml
中的
scala-maven-plugin
的配置参数中添加以下内容:
-Xmax-classfile-name
128
然后在
project/SparkBuild.scala
中添加:
scalacOptions in Compile ++= Seq("-Xmax-classfile-name", "128"),
到
sharedSettings
值。 如果您不确定在哪里添加这些行,请参阅
此 PR
。
IntelliJ IDEA 或 Eclipse
有关为Spark开发设置IntelliJ IDEA或Eclipse的帮助以及故障排除,请参阅 有用的开发工具页面 。
运行测试
测试默认通过 ScalaTest Maven 插件 运行。请注意,测试不应以根用户或管理员用户身份运行。
以下是运行测试的命令示例:
./build/mvn 测试
使用 SBT 进行测试
以下是运行测试的命令示例:
./build/sbt 测试
运行单独测试
有关如何运行单个测试的信息,请参阅 有用的开发者工具页面 .
PySpark pip 可安装
如果您在Python环境中构建Spark,并希望使用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 清理 打包
./build/sbt 测试:编译
./python/运行测试
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 版本
当 2.13 等其他版本的 Scala 被支持时,将可以为该版本构建。 使用以下方式更改主要的 Scala 版本(例如 2.13):
./dev/change-scala-version.sh 2.13
启用配置文件(例如 2.13):
# 对于 Maven
./build/mvn -Pscala-2.13 compile
# 对于 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" # 例如 '[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
。