使用Spark Runner运行Apache Beam Go SDK grades示例报NoSuchMethodError
问题根因
该报错是典型的Jackson依赖版本冲突:
- Spark 2.4.5集群默认内置的Jackson版本为2.9.x及更低,
TypeBindings.emptyBindings()方法是Jackson 2.10.0版本才新增的API - 你使用的Apache Beam版本依赖Jackson 2.10.0+,运行时Spark优先加载集群内置的低版本Jackson包,导致找不到对应方法
可行解决方案
按操作成本从低到高排序:
方案1:调整Spark类加载优先级
启动Spark作业服务器时开启用户依赖优先加载规则,让Beam带的高版本Jackson优先被加载,修改启动命令如下:
./gradlew :runners:spark:2:job-server:runShadow -PsparkMasterUrl=spark://localhost:7077 -PsparkArgs="--conf spark.driver.userClassPathFirst=true --conf spark.executor.userClassPathFirst=true"
该方案无需修改代码,90%以上同类型冲突都可以通过该配置解决。
方案2:Shade重定位Jackson依赖
如果方案1因为集群权限等限制无法生效,可以修改Beam源码中Spark 2.x Runner的构建配置,把Jackson依赖打包到独立命名空间避免冲突:
- 找到
runners/spark/2/build.gradle文件,在shadowJar配置块中新增重定位规则:
shadowJar { // 原有配置保留,新增下面规则 relocate 'com.fasterxml.jackson', 'shaded.com.fasterxml.jackson' }
- 重新编译构建Spark Runner作业服务器,再按原有命令启动即可
方案3:匹配Beam和Spark的依赖版本
降级使用Beam 2.24.0及更早版本,该版本区间的Beam默认依赖Jackson 2.9.x,和Spark 2.4.5内置的Jackson版本完全兼容,无API冲突。
验证步骤
任选上述方案调整后,重新启动Spark作业服务器,再执行grades -runner=spark -endpoint=localhost:8099 -job_name=gradetest命令即可正常运行,Python编写的Beam作业也会同步恢复正常。
内容的提问来源于stack exchange,提问作者lpad ze
相关产品推荐
相关产品推荐

