翻译: https://www.cloudera.com/documentation/enterprise/latest/topics/spark_building.html
版本: 5.14.2
您可以使用Apache Maven构建使用Java和Scala开发的Spark应用程序。
有关CDH 5组件的Maven属性,请参阅使用CDH 5 Maven存储库。对于Kafka的Maven属性,请参阅Kafka的Maven Artifacts。
构建应用
构建Spark Scala和Java应用程序时遵循以下最佳实践:
- 编译与您正在运行的同一版本的Spark。
- 构建包含所有依赖关系的单个程序集JAR(“Uber”JAR)。在Maven中,添加Maven组件插件来构建一个包含所有依赖关系的JAR:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
该插件在构建期间管理所有可用JAR文件的合并过程。从程序集JAR中排除Spark,Hadoop和Kafka(CDH 5.5及更高版本)类,因为它们已在集群中可用,并且包含在运行时类路径中。在Maven中,使用作用域指定Spark,Hadoop和Kafka依赖项provided。例如:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>1.5.0-cdh5.5.0</version>
<scope>provided</scope>
</dependency>
构建可重用模块
在Spark shell中使用现有的Scala和Java类需要有效的部署过程和依赖管理。为了简单和可靠地重用Scala和Java类以及完整的第三方库,您可以使用module ,这是一个由Maven创建的独立工件。这个模块可以被多个用户共享。本主题演示如何使用Maven创建一个包含所有依赖关系的模块。
创建一个Maven项目
- 使用Maven生成项目目录:
$ mvn archetype:generate -DgroupId=com.mycompany -DartifactId=mylibrary \
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
下载并部署第三方库
- 为所有未通过Maven Central提供的第三方库准备一个位置,但该项目需要该位置:
$ mkdir libs
$ cd libs
- 下载所需的工件。
- 使用Maven部署库JAR。
- 将该库添加到POM文件的依赖项部分。
- 对每个库重复步骤2-4。例如,要添加JIDT库:
- 下载并解压缩zip文件:
$ curl http://lizier.me/joseph/software/jidt/download.php?file=infodynamics-dist-1.3.zip > infodynamics-dist.1.3.zip
$ unzip infodynamics-dist-1.3.zip
- 部署库JAR:
$ mvn deploy:deploy-file \
-Durl=file:///HOME/.m2/repository -Dfile=libs/infodynamics.jar \
-DgroupId=org.jlizier.infodynamics -DartifactId=infodynamics -Dpackaging=jar -Dversion=1.3
- 将该库添加到POM文件的依赖项部分:
<dependency>
<groupId>org.jlizier.infodynamics</groupId>
<artifactId>infodynamics</artifactId>
<version>1.3</version>
</dependency>
- 将Maven组件插件添加到pom.xml 文件plugins 标签中 。
- 将库JAR包装在模块中:
$ mvn clean package
运行并测试Spark模块
- 运行Spark shell,在中提供模块JAR --jars 选项:
$ spark-shell --jars target/mylibrary-1.0-SNAPSHOT-jar-with-dependencies.jar
-
在Spark Web UI应用程序的环境选项卡((http://driver_host:4040/environment/)中,验证 spark.jars 属性包含库。例如:
在Spark shell中,测试您可以从第三方库中导入一些必需的Java类。例如,如果您使用JIDT库,请导入MatrixUtils:
$ spark-shell
...
scala> import infodynamics.utils.MatrixUtils;
用应用程序打包不同版本的库
要在应用程序中使用与Spark附带的库版本不同的库版本,请使用Apache Maven Shade插件。这个过程在技术上被称为“重定位”,并且通常称为"shading".
有关示例,请参阅重新分配类。