Xgboost4j运行报scala/Product$class类未找到错误的解决方案问询
XGBoost4J-Spark 0.90 Scala版本兼容错误解决方案
错误本质
触发的报错如下:
java.lang.NoClassDefFoundError: scala/Product$class
该错误属于典型的Scala版本二进制不兼容问题,xgboost4j 0.90默认使用Scala 2.11.x版本编译,若当前Spark集群运行的Scala版本为2.12.x及以上,就会触发类加载失败
具体解决办法
- 方案1:替换对应Scala版本的XGBoost依赖
确认集群Spark对应的Scala版本后,下载带对应Scala版本后缀的xgboost4j、xgboost4j-spark包:- 若集群Scala版本为2.11.x,使用无后缀或后缀为
_2.11的0.90版本包即可 - 若集群Scala版本为2.12.x,下载后缀为
_2.12的0.90版本适配包
- 若集群Scala版本为2.11.x,使用无后缀或后缀为
- 方案2:对齐集群Scala版本到2.11.x
若无法调整XGBoost依赖版本,可将集群Spark的运行Scala版本降级到2.11.x系列,和XGBoost 0.90默认编译版本完全对齐 - 方案3:升级XGBoost到更高版本
升级xgboost4j、xgboost4j-spark到1.0.0及以上版本,官方已提供Scala 2.12、Scala 2.13的官方编译版本,直接选择和集群Scala版本匹配的依赖即可
注意事项
- 提交Spark任务时,不要混用不同Scala版本的依赖包,否则会重复触发类兼容问题
- 若使用maven/sbt管理依赖,需要在依赖名后指定对应Scala版本后缀,示例坐标格式:
ml.dmlc:xgboost4j-spark_${scala.version}:${xgboost.version}
内容的提问来源于stack exchange,提问作者Searcher
相关产品推荐
相关产品推荐

