Spark Java应用打包为spark-submit可用的胖可运行Jar技术问询
用Maven打包Spark Java应用可运行Jar的解决方案
我之前也碰到过一模一样的场景——从普通Java项目转成Maven构建Spark应用时,怎么打出能正常用spark-submit运行的包含依赖的Jar确实需要调整配置。结合我的实践经验,给你两种靠谱的方案:
方案一:Maven Shade Plugin(首推)
Spark的依赖经常会和集群里的Hadoop、其他组件出现版本冲突,Shade插件能很好地处理包重定位、依赖合并这些问题,比普通打包插件更适配Spark场景。
直接把这段配置加到你的pom.xml的<build><plugins>节点里:
<!-- 先配置Java编译插件,确保JDK版本匹配 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <!-- 改成你实际用的JDK版本,比如11 --> <target>1.8</target> </configuration> </plugin> <!-- Shade核心配置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 配置主类,和你之前导出Jar时MANIFEST.MF里的主类完全一致 --> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.your.package.YourSparkMainClass</mainClass> </transformer> </transformers> <!-- 排除签名文件,避免打包后出现验证错误 --> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin>
配置好后,在项目根目录运行命令:
mvn clean package
打包完成后,target目录下会生成一个带-shaded后缀的Jar文件,这个就是你要的包含所有依赖的可运行Jar,直接用spark-submit提交就行。
方案二:Maven Assembly Plugin(适合简单场景)
如果你的项目依赖很少、没有复杂的版本冲突,Assembly插件足够满足需求,配置也更简单:
把这段配置加到pom.xml的<build><plugins>里:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <descriptorRefs> <!-- 内置的打包规则,直接打包所有依赖 --> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <!-- 同样要指定正确的主类 --> <mainClass>com.your.package.YourSparkMainClass</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
运行同样的mvn clean package命令,target目录下会生成带-jar-with-dependencies后缀的Jar,同样可以用spark-submit运行。
额外提醒
- 如果你是在Spark集群上运行,记得把Spark核心依赖(比如
spark-core、spark-sql)的scope设置为provided,因为集群环境本身已经有这些依赖了,重复打包反而容易出冲突:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>3.3.0</version> <!-- 改成你用的Spark版本 --> <scope>provided</scope> </dependency>
- 一定要确认主类的全路径正确,不然
spark-submit会找不到入口类。
内容的提问来源于stack exchange,提问作者DXC
相关产品推荐
相关产品推荐

