Spark 2.3.0升级后Netty版本冲突:除降级Cassandra依赖外有何方案?
嘿,这个依赖冲突引发的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

