如何构建适配AWS SageMaker SparkJarProcessing的spark-test-app.jar
报错根因
SparkJarProcessor底层通过spark-submit提交任务,仅支持符合Spark应用规范的jar包,普通无Spark上下文的Java主类无法被Spark启动器识别,因此抛出Could not execute HW class错误。官方示例中的spark-test-app.jar就是标准的Spark应用,核心是必须初始化Spark入口对象,不能写纯Java SE的main方法。
可直接运行的样例代码
Scala版本(和官方示例实现逻辑一致)
构建配置(sbt)
文件路径:build.sbt
name := "spark-test-app" version := "1.0" scalaVersion := "2.12.14" // Spark依赖设置为provided,运行时由SageMaker环境提供 libraryDependencies += "org.apache.spark" %% "spark-sql" % "3.1.3" % "provided"
业务代码
文件路径:src/main/scala/com/test/HW.scala
package com.test import org.apache.spark.sql.SparkSession object HW { def main(args: Array[String]): Unit = { // 初始化Spark入口,是Spark应用必须的逻辑 val spark = SparkSession.builder() .appName("sm-spark-hello") .getOrCreate() println("Hello World from SageMaker Spark Jar Processor!") // 打印传入的自定义参数 args.foreach(arg => println(s"接收到参数: $arg")) spark.stop() } }
执行sbt package即可生成可提交的jar包。
Java版本
构建配置(Maven)
核心配置段写在pom.xml中:
<dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.1.3</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.test.HW</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>
业务代码
文件路径:src/main/java/com/test/HW.java
package com.test; import org.apache.spark.sql.SparkSession; public class HW { public static void main(String[] args) { SparkSession spark = SparkSession.builder() .appName("sm-spark-java-hello") .getOrCreate(); System.out.println("Hello World from SageMaker Spark Java Job!"); for (String arg : args) { System.out.println("接收到参数: " + arg); } spark.stop(); } }
执行mvn package即可生成可提交的jar包。
打包提交注意事项
- 所有Spark相关依赖必须设置为
provided作用域,不要把Spark依赖打进最终jar包,否则会出现类冲突报错。 - 选择和SageMaker Spark框架版本匹配的依赖版本:
framework_version="3.1"对应Spark 3.1.x、Scala 2.12,不要用Scala 2.11/2.13版本编译,否则会出现版本不兼容问题。 - 主类必须实现Spark上下文初始化逻辑,不能是无Spark依赖的纯Java SE程序。
内容的提问来源于stack exchange,提问作者wavemonger
相关产品推荐
相关产品推荐

