使用Spark MLlib分布式Kmeans遇ClassNotFoundException问题求助
解决Spark MLlib Kmeans运行时的
breeze.storage.Zero$DoubleZero$类找不到问题 问题原因
Spark 3.3.0本身内置了特定版本的Breeze库,你手动引入的Breeze 2.1.0版本与Spark内置版本存在依赖冲突,导致类加载时找不到对应的Zero$DoubleZero$类。Scala 2.13环境下,不同Breeze版本的包结构或类定义有差异,进一步加剧了这个问题。
解决方案
1. 排除Spark内置Breeze依赖,统一使用指定版本
在构建文件中排除Spark MLlib自带的Breeze相关依赖,强制使用你指定的Breeze 2.1.0版本:
SBT项目配置:
libraryDependencies += "org.apache.spark" %% "spark-mllib" % "3.3.0" excludeAll( ExclusionRule("org.scalanlp", "breeze"), ExclusionRule("org.scalanlp", "breeze-macros"), ExclusionRule("org.scalanlp", "breeze-viz") ) libraryDependencies += "org.scalanlp" %% "breeze" % "2.1.0" libraryDependencies += "org.scalanlp" %% "breeze-macros" % "2.1.0"
Maven项目配置:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-mllib_2.13</artifactId> <version>3.3.0</version> <exclusions> <exclusion> <groupId>org.scalanlp</groupId> <artifactId>breeze_2.13</artifactId> </exclusion> <exclusion> <groupId>org.scalanlp</groupId> <artifactId>breeze-macros_2.13</artifactId> </exclusion> <exclusion> <groupId>org.scalanlp</groupId> <artifactId>breeze-viz_2.13</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.scalanlp</groupId> <artifactId>breeze_2.13</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>org.scalanlp</groupId> <artifactId>breeze-macros_2.13</artifactId> <version>2.1.0</version> </dependency>
2. 改用Spark内置兼容的Breeze版本
如果不需要Breeze 2.1.0的特定功能,可直接移除手动引入的Breeze依赖,完全使用Spark 3.3.0内置的Breeze版本(对应兼容版本为1.2左右,适配Scala 2.13),从根源避免版本冲突。
3. 集群提交时处理依赖合并
若打包提交到Spark集群,使用assembly或shadowJar时需配置合并策略,优先保留指定版本的Breeze类:
// SBT-assembly 示例配置 assemblyMergeStrategy in assembly := { case PathList("breeze", "storage", "Zero.class") => MergeStrategy.first case PathList("breeze", "storage", "Zero$.class") => MergeStrategy.first case x => val oldStrategy = (assemblyMergeStrategy in assembly).value oldStrategy(x) }
验证步骤
修改依赖后,执行构建工具的clean命令清理本地缓存,重新编译打包,再运行Kmeans任务,确认ClassNotFoundException是否消失。
内容的提问来源于stack exchange,提问作者Reda20
相关产品推荐
相关产品推荐

