提交Shaded JAR至Dataproc集群遇java.lang.NoClassDefFoundError问题排查
Shade插件打包不完整
Maven Shade插件配置不当可能导致目标依赖类未被完整打包进Jar。比如配置<filters>时意外排除了关键类,或是用<relocations>重命名类后,代码里的引用路径没同步更新。本地运行时开发环境可能已包含这些缺失类所以正常,但Dataproc集群没有对应依赖,就会触发错误。检查pom.xml里的Shade插件配置,确保目标类所在依赖被正确打包,没有被排除或因重命名导致引用失效。Dataproc类加载优先级冲突
Dataproc集群自带Hadoop、Spark等基础依赖,版本可能和你Jar里打包的依赖不一致。集群类加载器会优先加载自带库,导致你Jar里的类被覆盖,或是因版本不兼容找不到对应类。可以尝试提交任务时添加参数:--conf spark.driver.userClassPathFirst=true --conf spark.executor.userClassPathFirst=true,让用户Jar的类优先加载(注意这可能引发其他兼容性问题,需测试后使用);也可以对齐依赖版本和Dataproc集群预装版本。Maven依赖范围错误
如果目标类所在的Maven依赖被设为<scope>provided</scope>,Shade插件默认不会将这些类打包进Jar。本地独立集群可能自带这些provided级别的依赖,但Dataproc集群的预装版本可能缺失该类或版本不匹配。把依赖的scope改成compile,重新打包后再提交。Jar包损坏或上传不完整
上传到Dataproc集群(尤其是HDFS路径)的Jar可能在传输中损坏,导致部分类文件缺失。可以重新上传Jar,或是用hadoop fs -checksum hdfs://path/to/your.jar对比本地Jar的校验值,确认文件完整性。集群权限问题
执行任务的用户(如spark用户)没有Jar文件的读取权限,或是Jar所在的HDFS路径权限不足。检查Jar的本地权限和HDFS路径权限,确保执行用户拥有读权限。
内容的提问来源于stack exchange,提问作者Ahmed Hesham

