You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 10:19:57