Spark2.2.0加载随机森林模型触发Netty AbstractMethodError问题求助
问题判定
你遇到的报错确实是Spark Core 2.2.0与Netty 4.1.6.Final的版本兼容性问题导致的。
根因说明
Spark 2.2.0官方默认绑定的Netty版本为4.0.43.Final,Netty 4.0和4.1属于大版本迭代,ReferenceCountUtil相关的底层接口存在不兼容变更。Spark 2.2.x的网络通信组件是基于Netty 4.0的API开发的,运行时加载Netty 4.1版本的类时,找不到对应实现的方法,就会抛出AbstractMethodError异常。
解决方案
- 方案一:降级Netty版本
直接将项目的Netty版本降至4.0.43.Final,和Spark 2.2.0的官方依赖版本完全对齐,该方案适配成本最低,不会出现其他兼容性问题。 - 方案二:升级Spark版本
若项目必须使用Netty 4.1.x版本,可以将Spark版本升级至2.3.0及以上,Spark从2.3.0版本开始正式支持Netty 4.1.x系列版本,可直接适配你当前使用的Netty 4.1.6.Final。 - 方案三:依赖隔离打包
若既不能降级Netty也不能升级Spark,可以使用maven-shade-plugin(Maven项目)或shadow插件(Gradle项目),将Spark依赖的Netty包重命名后独立打包,和项目全局的Netty版本做类加载隔离,避免版本冲突。
额外优化建议
你当前代码中每次请求都会新建JavaSparkContext实例,属于不必要的资源重复创建,建议将SparkContext改为项目启动时全局初始化一次,后续请求复用同一实例即可,可减少资源消耗和潜在的运行异常。
内容的提问来源于stack exchange,提问作者king geray
相关产品推荐
相关产品推荐

