Spark - ml.dmlc.xgboost4j / spark 版本匹配与 NoSuchMethodError 解决

简介: spark 项目引入 ml.dmlc.xgboost4j 训练并读取 xgboost 模型,load 模型期间报错 NoSuchMethodError,通过源码的分析得到 xgboost 与 spark 版本对应关系。

 一.版本匹配问题

spark 项目引入 ml.dmlc.xgboost4j 训练并读取 xgboost 模型,load 模型期间报错 NoSuchMethodError,通过源码的分析得到 xgboost 与 spark 版本对应关系。

xgboost 依赖:

<dependency>
            <groupId>ml.dmlc</groupId>
            <artifactId>xgboost4j-spark</artifactId>
            <version>$version</version>
        </dependency>

image.gif

spark 依赖:

<dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-mllib_2.11</artifactId>
            <version>$version</version>
        </dependency>

image.gif

对应关系:

使用 xgboost 时需要保证 spark 版本大于等于下表对应 spark 版本

Xgboost  Version Spark
0.70 2.3.0
0.80 2.3.0
0.81 2.3.1
0.82 2.3.3
0.90 2.4.3
1.0.0 2.4.3
1.1.0 2.4.3
1.2.0 3.0.0
1.3.0 3.0.0

二.NoSuchMethodError 解决历程

由于使用的 xgboost 的 spark 版本与实验环境 spark 版本不一致,排了半天依赖冲突的错误,博主 spark 环境为 2.4.5。

1.Error: org.json4s.jackson.JsonMethods$.parse

image.gif编辑

起初使用 0.70 版本的 Xgboost,执行后报错 Error: org.json4s.jackson.JsonMethods$.parse(Lorg/json4s/JsonInput;Z)Lorg/json4s/JsonAST$JValue,上面日志的报错信息多了 shaded 标识,因为起初认为是依赖冲突才导致的 NosuchMethod,但是发现 shaded 重定向后依然不生效才把问题锁定到 Spark 版本依赖而非 org.json4s.jackson 依赖冲突。

2.Error: org.apache.spark.ml.util.MLReadable.$init

image.gif编辑

既然冲突来源于 Spark 版本依赖,那么只需寻找适配 spark = 2.4.5 的 xgboost 版本即可。提高版本执行后报错 java.lang.NoSuchMethodError: org.apache.spark.ml.util.MLReadable.$init$(Lorg/apache/spark/ml/util/MLReadable;)V。

3.查看源码

当然使用二分法一个一个试 xgboost 的版本也是没有问题的,但是不够优雅,所以决定查看 Xgboost 源码,寻找其 jar 包编译对应的 spark 版本,登录 xgboost 的 Github 查看其 java-package 中对应的 pom 文件获取其编译对应的 spark 版本,选择不同的 release 版本即可。

image.gif编辑

三.总结

关于 NosuchMethodError 这个错,之前已经总结过两篇文章:解决汇总V1解决汇总V2 ,加上这篇文章一共三篇,几乎覆盖了本地和集群执行几种常见的 NoSuchMethod 的解决方法,总的来说还是先定位再解决比较省事,常见的问题和解决方案如下:

A.Exclude 去除多余依赖

常见于 A.jar B.jar 拥有相同方法名,例如都拥有 com.xxx.run 方法,就会报错

B.Relocation 重定向方法名

场景同上,多见于同一方法名存放在项目依赖的不同 dependency 中

C.执行 Jar 包高低版本

同一项目,但在不同 dependency 中存在高低版本,就会报错,例如 v1,v2 版本都有 com.xxx.run 方法,需要对高低版本进行取舍,保留其一

D.执行环境高低版本

同一项目,不同 dependency 编译的 spark 环境 or 其他执行环境不同,就会报错,例如上面提到的 xgboost 场景,这时候需要保持执行环境一致才能解除报错

E.Java 虚拟机高低版本

项目按 java 1.8/8 编译,但执行环境为 1.7/7 ,常见于 java -c 本地执行任务,将 java 环境统一即可解决问题

通过查询源码编译版本,最终任务在 Spark = 2.4.5 / Xgboost = 0.90 的版本下执行成功,非常的奈斯 👍


目录
相关文章
|
SQL 消息中间件 分布式计算
如何查看spark与hadoop、kafka、Scala、flume、hive等兼容版本【适用于任何版本】
如何查看spark与hadoop、kafka、Scala、flume、hive等兼容版本【适用于任何版本】
691 0
如何查看spark与hadoop、kafka、Scala、flume、hive等兼容版本【适用于任何版本】
|
3月前
|
分布式计算 Java Scala
spark 与 scala 的对应版本查看、在idea中maven版本不要选择17,弄了好久,换成11就可以啦
spark 与 scala 的对应版本查看、.在idea中maven版本不要选择17,弄了好久,换成11就可以啦
116 2
|
分布式计算 监控 安全
【墨菲安全实验室】Spark(3.1.2, 3.2.1, 3.3.0版本)shell命令注入漏洞
【墨菲安全实验室】Spark(3.1.2, 3.2.1, 3.3.0版本)shell命令注入漏洞
【墨菲安全实验室】Spark(3.1.2, 3.2.1, 3.3.0版本)shell命令注入漏洞
|
分布式计算 算法 调度
spark2.2以后版本任务调度将增加黑名单机制
spark2.2以后版本任务调度将增加黑名单机制
250 0
|
SQL 分布式计算 Java
spark入门(2.0.1版本):概述,下载,编译,运行环境及实例运行
spark入门(2.0.1版本):概述,下载,编译,运行环境及实例运行
154 0
|
分布式计算 Java Scala
一天学完spark的Scala基础语法教程十三、文件IO操作(idea版本)
一天学完spark的Scala基础语法教程十三、文件IO操作(idea版本)
98 0
一天学完spark的Scala基础语法教程十三、文件IO操作(idea版本)
|
分布式计算 Java Scala
一天学完spark的Scala基础语法教程十二、异常处理(idea版本)
一天学完spark的Scala基础语法教程十二、异常处理(idea版本)
170 0
一天学完spark的Scala基础语法教程十二、异常处理(idea版本)
|
分布式计算 Java Scala
一天学完spark的Scala基础语法教程十一、正则表达式(idea版本)
一天学完spark的Scala基础语法教程十一、正则表达式(idea版本)
121 0
一天学完spark的Scala基础语法教程十一、正则表达式(idea版本)
|
存储 分布式计算 Java
一天学完spark的Scala基础语法教程十、类和对象(idea版本)
一天学完spark的Scala基础语法教程十、类和对象(idea版本)
97 0
一天学完spark的Scala基础语法教程十、类和对象(idea版本)
|
分布式计算 Scala Spark
一天学完spark的Scala基础语法教程九、迭代器(idea版本)
一天学完spark的Scala基础语法教程九、迭代器(idea版本)
110 0
一天学完spark的Scala基础语法教程九、迭代器(idea版本)