提交Shaded Jar到Dataproc作为Spark Job时遇NoClassDefFoundError问题
问题描述
将Shaded Jar提交到Dataproc作为Spark Job运行时,出现以下错误:
java.lang.NoClassDefFoundError: org/apache/beam/sdk/coders/CoderProviderRegistrar
已确认该类存在于Shaded Jar中,请求排查问题原因。
(堆栈截图显示错误调用链涉及Beam相关组件的初始化流程)
可能的原因及解决方法
Shading打包配置错误
使用Maven Shade或Gradle Shadow插件打包时,若配置不当可能导致类或SPI注册文件丢失:- 检查插件配置,确保
org.apache.beam.sdk.coders.CoderProviderRegistrar类未被过滤; - 必须合并
META-INF/services目录下的SPI注册文件(如org.apache.beam.sdk.coders.CoderProviderRegistrar),避免打包时被覆盖。
- 检查插件配置,确保
集群依赖版本冲突
Dataproc集群预装的Beam版本与Shaded Jar中的版本不一致,类加载时优先加载集群旧版本(旧版本可能无此类):- 提交Job时添加
--packages org.apache.beam:beam-sdks-java-core:你的版本,强制使用指定版本; - 在Shade配置中对Beam包进行relocate重命名(如将
org.apache.beam改为com.yourcompany.beam),隔离集群自带依赖。
- 提交Job时添加
Jar包完整性问题
本地执行jar tf your-shaded.jar | grep CoderProviderRegistrar,再次验证类是否存在于Jar中;若存在,重新上传Jar到集群,排除传输损坏可能。提交参数引发的依赖冲突
检查Spark Job提交命令中的--jars、--classpath参数,移除可能与Beam依赖冲突的第三方Jar包。
内容的提问来源于stack exchange,提问作者Ahmed Hesham
相关产品推荐
相关产品推荐

