如何解决Java提交Spark Jobserver作业时出现JOB Loading Failed错误
报错详情:
{ "status": "JOB LOADING FAILED", "result": { "message": "com.sample.wordcount.SparkJavaJob cannot be cast to spark.jobserver.api.SparkJobBase", "errorClass": "java.lang.ClassCastException" } }
问题根因
该类转换异常本质是提交的作业类和Spark JobServer服务端的类定义不匹配,服务端要求作业类必须继承spark.jobserver.api.SparkJobBase,当前实现的类不符合这个要求。
排查步骤
- 核对Spark JobServer服务端版本和本地代码依赖的jobserver API版本是否完全一致,大小版本都要对齐,不同版本的Java API接口继承规则有差异。
- 检查作业jar的打包配置,确认是否把spark-jobserver相关依赖打进了jar包,同包名的重复类会被JVM识别为不同类型,直接触发转换异常。
- 查看本地依赖的
JSparkJob接口源码,确认它是否默认继承了SparkJobBase,部分老旧版本的Java API没有做这个默认继承。
解决方案
1. 调整依赖配置
把本地构建配置里spark-jobserver相关依赖的版本改成和服务端完全一致,同时把依赖scope设为provided,避免相关类打进作业jar。
Maven配置示例:
<dependency> <groupId>spark.jobserver</groupId> <artifactId>spark-jobserver-japi_2.12</artifactId> <version>替换为你的服务端实际版本号</version> <scope>provided</scope> </dependency>
Gradle配置示例:
compileOnly 'spark.jobserver:spark-jobserver-japi_2.12:你的服务端版本号'
2. 修正作业类继承关系
如果版本对齐后还是报错,说明你使用的JobServer版本需要作业类显式继承SparkJobBase,修改代码如下:
package com.sample.wordcount; import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; import spark.jobserver.japi.JSparkJob; import spark.jobserver.api.JobEnvironment; import spark.jobserver.api.SparkJobBase; public class SparkJavaJob extends SparkJobBase implements JSparkJob { @Override public Object run(Object sc, JobEnvironment runtime, Config data) { return "OK"; } @Override public Config verify(Object sc, JobEnvironment runtime, Config config) { return ConfigFactory.empty(); } }
3. 重新提交作业
清理历史构建产物,重新打包作业jar后提交到Spark JobServer即可正常加载。
内容的提问来源于stack exchange,提问作者Abhisek Ray
相关产品推荐
相关产品推荐

