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

Spark 2.3.0升级后Netty版本冲突:除降级Cassandra依赖外有何方案?

解决Spark 2.3.0与Cassandra依赖的Netty版本冲突问题

嘿,这个依赖冲突引发的NoSuchMethod异常我之前帮团队排查过,除了降级Cassandra相关依赖,还有几个更合理的解决方向,给你详细拆解:

1. 升级Spark-Cassandra-Connector到适配Spark 2.3的版本

这是最稳妥的方案——你当前用的spark-cassandra-connector_2.0.7是对应Spark 2.2的版本,和Spark 2.3的依赖兼容性本来就有问题。直接升级到2.3.2版本(官方适配Spark 2.3的稳定版),它依赖的cassandra-driver-core是3.7.2,已经处理了Netty版本的兼容问题。

比如Maven中修改依赖:

<dependency>
    <groupId>com.datastax.spark</groupId>
    <artifactId>spark-cassandra-connector_2.11</artifactId>
    <version>2.3.2</version>
</dependency>

Gradle的话:

implementation 'com.datastax.spark:spark-cassandra-connector_2.11:2.3.2'

升级后不需要手动调整Netty版本,官方已经做好了依赖调和,风险最低。

2. 强制统一Netty为4.x兼容版本

Spark 2.3.0虽然默认依赖Netty 3.9.x,但实际上它的网络组件可以兼容Netty 4.x。你可以在构建工具中强制指定Netty版本为和Cassandra驱动匹配的4.x版本(比如4.0.44.Final,和cassandra-driver-core_3.4.0兼容),让整个项目都使用Netty 4,这样org.apache.spark.network.util.NettyMemoryMetrics就能找到PooledByteBufAllocator.metric()方法了。

Maven配置:

在dependencyManagement中添加强制版本:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.0.44.Final</version>
        </dependency>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-buffer</artifactId>
            <version>4.0.44.Final</version>
        </dependency>
        <!-- 其他Netty子模块也可以统一强制这个版本,避免遗漏 -->
    </dependencies>
</dependencyManagement>

Gradle配置:

configurations.all {
    resolutionStrategy.force 'io.netty:netty-all:4.0.44.Final'
    resolutionStrategy.force 'io.netty:netty-buffer:4.0.44.Final'
}

注意:这样做后建议测试下Spark的RPC、Shuffle等核心功能是否正常,大部分场景下是稳定的,但需要验证你的业务场景。

3. 排除Spark自带的Netty 3依赖

配合上面的强制Netty 4版本,你可以在引入Spark核心依赖时,排除掉它自带的Netty 3.x依赖,彻底消除版本冲突的根源。

比如Maven中:

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
    <version>2.3.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.jboss.netty</groupId>
            <artifactId>netty</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Gradle的话:

implementation('org.apache.spark:spark-core_2.11:2.3.0') {
    exclude group: 'org.jboss.netty', module: 'netty'
}

总结一下,优先推荐升级Spark-Cassandra-Connector版本,这是官方适配的方案,最省心;如果暂时不能升级connector,再考虑强制Netty 4版本+排除Netty 3的组合方案。

内容的提问来源于stack exchange,提问作者rodders

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:52:03