当我们把Spark Streaming程序开发好以后,放到测试环境测试时,如何通过Maven打包呢?
在这篇文章中,我将介绍两种Maven的build方式。
推荐使用第二种方式。
所有依赖打成一个jar包
通过这种方式,把所有的依赖都打成一个大的jar包。
通过spark-submit
执行程序时,简单方便,不需要指定jars
参数。
依赖多的时候,有时候包会有几百M,在网络传输过程时效率不高。
pom.xml
文件的build
节点需要添加如下两个Maven插件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <plugins> <plugin> <groupId>org.scala-tools</groupId> <artifactId>maven-scala-plugin</artifactId> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass></mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins>
|
使用org.scala-tools:maven-scala-plugin
插件有个好处是,如果项目里面有src/main/java
和src/main/scala
两种语言混编时,可以成功编译源码。
1 2
| [INFO] /Users/simon/Development/workspace/scala/spark-streaming-demo/src/main/java:-1: info: compiling [INFO] /Users/simon/Development/workspace/scala/spark-streaming-demo/src/main/scala:-1: info: compiling
|
执行Spark任务命令:
1 2 3
| bin/spark-submit --master local[2] \ --class gy.finolo.spark.project.StreamingApp \ ../data/app/spark-streaming-demo-1.0-SNAPSHOT.jar localhost:9092 streamingtopic
|
打成一个小jar和lib依赖文件夹
Spark Streaming源码被修改后,打成小包就可以上传服务器,传输流量小,速度快。
提交任务时,需要指定jars参数
pom.xml
文件的build
节点需要添加如下两个Maven插件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <plugins> <plugin> <groupId>org.scala-tools</groupId> <artifactId>maven-scala-plugin</artifactId> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> </execution> </executions> </plugin>
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.10</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <excludeScope>provided</excludeScope> </configuration> </execution> </executions> </plugin> </plugins>
|
执行Spark任务命令,需要指定jars参数,注意:这里不是lib的地址。
1 2 3 4
| bin/spark-submit --master local[2] \ --class gy.finolo.spark.project.StreamingApp \ --jars $(echo ../data/app/lib/*.jar | tr ' ' ',') \ ../data/lib/spark-streaming-demo-1.0-SNAPSHOT.jar localhost:9092 streamingtopic
|
$(echo ../data/app/lib/*.jar | tr ' ' ',')
代码的意思是把jar包名以逗号分隔符拼接成一个字符串。