Spark 2.3.0 netty 版本问题:NoSuchMethod io.netty.buffer.PooledByteBufAllocator.metric()

Spark 2.3.0 netty version issue: NoSuchMethod io.netty.buffer.PooledByteBufAllocator.metric()

我刚刚将我的 spark 项目从 2.2.1 升级到 2.3.0,发现下面的版本异常。我依赖于 datastax 中的 spark-cassandra-connector.2.0.7 和 cassandra-driver-core.3.4.0,它们又依赖于 netty 4.x 而 spark 2.3.0 使用 3.9.x.

引发异常 org.apache.spark.network.util.NettyMemoryMetrics 的 class 已在 spark 2.3.0 中引入。

降级我的 Cassandra 依赖项是绕过异常的唯一方法吗?谢谢!

Exception in thread "main" java.lang.NoSuchMethodError: io.netty.buffer.PooledByteBufAllocator.metric()Lio/netty/buffer/PooledByteBufAllocatorMetric;
at org.apache.spark.network.util.NettyMemoryMetrics.registerMetrics(NettyMemoryMetrics.java:80)
at org.apache.spark.network.util.NettyMemoryMetrics.<init>(NettyMemoryMetrics.java:76)
at org.apache.spark.network.client.TransportClientFactory.<init>(TransportClientFactory.java:109)
at org.apache.spark.network.TransportContext.createClientFactory(TransportContext.java:99)
at org.apache.spark.rpc.netty.NettyRpcEnv.<init>(NettyRpcEnv.scala:71)
at org.apache.spark.rpc.netty.NettyRpcEnvFactory.create(NettyRpcEnv.scala:461)
at org.apache.spark.rpc.RpcEnv$.create(RpcEnv.scala:57)
at org.apache.spark.SparkEnv$.create(SparkEnv.scala:249)
at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:175)
at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:256)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:423)

您似乎使用了 "too old" netty 4 版本。也许你的类路径上有多个?在类路径上有 netty 4.x 和 3.x 应该没问题。

为了工作方便,我想在答案中添加更多细节,只是 运行 mvn dependency:tree -Dverbose -Dincludes=io.netty:netty-all 它会 return 使用 io.netty 的所有依赖项及其版本。在我的例子中,罪魁祸首是 Hive Jdbc 2.1.0,它的 netty-all 版本低于 spark 2.3.1 使用的版本,因此类路径省略了加载 spark 的 netty,因为它已经从 hive-jdbc.

因此解决方法是从 pom.xml

中的 Hive-Jdbc 中排除依赖项