使用Maven构建Spark需要Maven 3.0.4+和Java 6 +。
注意: 使用Java 7+构建Spark生成的JAR,前期使用Java 6构建的程序无法识别。如果有这种问题,还是使用Java 6来构建吧。
build/mvn
构建
为了方便从源代码构建和部署, Spark在build/目录下封装有Maven的独立安装脚本。这个脚本将自动下载和安装所有必要的构建需求(Maven , Scala , Zinc ),下载后就存放在build/目录下。 为了确保构建所需要的合适的版本,不管之前是否已经安装有其他版本,maven都会存放一份构建所对应版本的Scala和Zinc副本。执行build/mvn
和
执行maven的命令差不多,目的是方便从
maven
的构建转换过来
。下面是一个构建Spark的例子:
build/mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -DskipTests clean package
其他构建示例后面会看到。
如果需要设置 MAVEN_OPTS
使Maven使用更多的内存 。 推荐以下设置:
export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
如果不进行设置,可能会看到下面的错误:
[INFO] Compiling 203 Scala sources and 9 Java sources to /Users/me/Development/spark/core/target/scala-2.10/classes...
[ERROR] PermGen space -> [Help 1]
[INFO] Compiling 203 Scala sources and 9 Java sources to /Users/me/Development/spark/core/target/scala-2.10/classes...
[ERROR] Java heap space -> [Help 1]
通过设置上面所说 MAVEN_OPTS
项可以解决这个问题
注意: * 对于Java 8+这一步不是必需的。
* 如果使用 build/mvn
而且MAVEN_OPTS
没有设置,脚本将自动为你进行设置。
因为HDFS的版本之间的协议并不兼容,如果想从HDFS读取数据,需要根据特定的HDFS版本进行构建。 可以通过“hadoop.version”属性来进行设置。如果没有设置这个属性,Spark默认根据Hadoop 1.0.4版本进行构建。但请注意,特定的Hadoop版本构建需要一些对应的配置文件:
Hadoop版本 |
配置文件需要 |
0.23.x |
hadoop - 0.23 |
1.x to 2.1.x |
(none) |
2.2.x |
hadoop - 2.2 |
2.3.x |
hadoop - 2.3 |
2.4.x |
hadoop - 2.4 |
对于Apache Hadoop1.x版本,Cloudera CDH “mr1”分布版,以及其他不带yarn的Hadoop版本,使用如下配置:
# Apache Hadoop 1.2.1
mvn -Dhadoop.version=1.2.1 -DskipTests clean package
# Cloudera CDH 4.2.0 with MapReduce v1
mvn -Dhadoop.version=2.0.0-mr1-cdh4.2.0 -DskipTests clean package
# Apache Hadoop 0.23.x
mvn -Phadoop-0.23 -Dhadoop.version=0.23.7 -DskipTests clean package
如果需要“yarn.version”与“hadoop.version”不相同,也通过设置”yarn.version”属性来设置。 Spark只支持yarn 2.2.0以及之后的版本。
例子:
# Apache Hadoop 2.2.X
mvn -Pyarn -Phadoop-2.2 -Dhadoop.version=2.2.0 -DskipTests clean package
# Apache Hadoop 2.3.X
mvn -Pyarn -Phadoop-2.3 -Dhadoop.version=2.3.0 -DskipTests clean package
# Apache Hadoop 2.4.X or 2.5.X
mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=VERSION -DskipTests clean package
Versions of Hadoop after 2.5.X may or may not work with the -Phadoop-2.4 profile (they were
released after this version of Spark).
# Different versions of HDFS and YARN.
mvn -Pyarn -Phadoop-2.3 -Dhadoop.version=2.3.0 -Dyarn.version=2.2.0 -DskipTests clean package
Spark也提供对Hive(包括JDBC Server和CLI)的支持,添加构建参数项: -Phive
和 Phive-thriftserver
即可。 默认情况下Spark将与Hive 0.13.1绑定构建。 当然也可以指定版本构建,与Hive 0.12.0绑定构建使用构建参数项-Phive-0.12.0
。
# Apache Hadoop 2.4.X with Hive 13 support
mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -Phive -Phive-thriftserver -DskipTests clean package
# Apache Hadoop 2.4.X with Hive 12 support
mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -Phive -Phive-0.12.0 -Phive-thriftserver -DskipTests clean package
如果想使用Scala 2.11编译构建Spark,使用 -dscala-2.11
属性:
dev/change-version-to-2.11.sh
mvn -Pyarn -Phadoop-2.4 -Dscala-2.11 -DskipTests clean package
使用Scala 2.11构建Spark不支持一些特性,原因在于这些特性依赖于Scala 2.11的依赖关系,而不是只依赖于Scala 2.11自身。 具体来说,Spark的外部Kafka库和JDBC组件不支持使用Scala 2.11构建。
默认情况下通过 ScalaTest Maven插件 进行测试。
有些测试需要在Spark先打好包才能进行,所以大多数情况下第一次构建的时候都是加上-DskipTests
参数项
。 下面是一个例子,一个正确的序列(构建、测试):
mvn -Pyarn -Phadoop-2.3 -DskipTests -Phive -Phive-thriftserver clean package
mvn -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver test
ScalaTest插件还支持只运行一个特定的测试套件,如下所示:
mvn -Dhadoop.version=... -DwildcardSuites=org.apache.spark.repl.ReplSuite test
我们使用scala-maven-plugin来支持增量和持续编译。 如
mvn scala:cc
将会运行连续编译(例如:等待变化)。 然而,这些还未经过广泛的测试。一些陷阱要注意:
· 它只扫描 src/main
和 src/test
路径(详见文档 ),所以它只适合这种内部结构的某些子模块。
· 通常情况下, 某些子模块要想正常运行工作,需要在项目根目录下运行 mvn install
进行编译.这是因为这些子模块需要通过spark-parent
模块
依赖于其他子模块)。
因此,核心
子模块的持续编译的完整流程如下:
mvninstall cd core $mvn scala:cc
使用IntelliJ IDEA或Eclipse构建Spark和故障排除的帮助文档,请参阅 IDE安装Wiki页面 。
注意:Debian软件包已被弃用,已经计划在Spark 1.4删除 。
Maven构建支持构建包含fat-jar,PySpark,必要的脚本和配置文件的Debian软件包。如下:
mvn -Pdeb -DskipTests clean package
执行命令之后debian软件包存放在assembly/target目录下. 软件包被添加了短提交散列文件名称,以便可以区分独立快照(SNAPSHOT)版本。
只运行Java 8测试如下:
mvn install -DskipTests -Pjava8-tests
当-Pjava8-tests
被设置时
,
无论
-DskipTests
是否设置
,
都将运行
Java8
测试。当然
运行这些测试之前,系统必须安装有JDK 8。 如果安装了JDK 8但它不是系统默认,您可以设置JAVA_HOME指向JDK 8。
Yarn上的PySpark仅支持用Maven构建。 此外,基于Red Hat的操作系统构建时会出现问题(见 spark-1753 )。 如果你想在Red Hat操作系统上运行Yarn集群上的PySpark,建议在其他地方构建jar, 然后上传到集群。具体原因正在排查中。
默认情况下, mvn package
打包
包括Spark的所有依赖,包括Hadoop和其它的一些相关项目。 对于Yarn部署,这将导致在executor类路径上出现多个版本。在Spark构建包和每个节点上的yarn.application.classpath会出现各自的版本。 通过使用hadoop-provided
配置构建不会包括Hadoop以及相关项目,例如ZooKeeper 和Hadoop本身。
构建Spark, 官方推荐Maven,是“构建参考”。但SBT支持日常开发,因为它可以提供更快的迭代编译。更高级的开发人员可能希望使用SBT。
SBT构建基于Maven POM文件,所以Maven配置文件和变量同样适用于SBT构建。 例如:
build/sbt -Pyarn -Phadoop-2.3 assembly
有些测试需要先构建Spark,所以一般先运行build/sbt
。 下面是一个例子,一个正确的序列(构建、测试):
build/sbt -Pyarn -Phadoop-2.3 -Phive -Phive-thriftserver assembly
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 core/test
Zinc 是一个长期运行的服务器版本的SBT增量 编译器。 当作为后台进程在本地运行时,它可以加快基于Scala的项目编辑速度,例如Spark。经常使用Maven重新编译Spark的开发人员应该会对Zinc感兴趣。 Zinc项目网站有Zinc构建和运行的介绍. OS X用户可以使用 brew install zinc
来安装。
如果使用build/mvn
打包 zinc
自动会被下载并被用于所有的构建. 这个过程在第一次调用build/mvn
时自动启动
,
如果
ZINC_PORT
环境变量没有设置
,
默认绑定
3030
端口。可以随时通过
build/zinc-<version>/bin/zinc –shutdown
来关掉
Zinc,
每次调用
build/mvn
时它又会自动重启。