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

rod*_*ers 6 cassandra netty apache-spark

我刚刚将我的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已在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)
Run Code Online (Sandbox Code Playgroud)

Nor*_*rer 14

看起来你使用的是"太旧"的netty 4版本.也许你的类路径上有多个?在类路径上使用netty 4.x和3.x应该没问题.

  • 我把这个片段添加到我的pom中,从而强制一个常见的netty引用:`<dependencyManagement> <dependencies> <dependency> <groupId> io.netty </ groupId> <artifactId> netty-all </ artifactId> <version > 4.1.17.Final </ version> </ dependency> </ dependencies> </ dependencyManagement>` (4认同)

Vic*_*cky 6

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

因此解决方法是从 pom.xml 中的 Hive-Jdbc 中排除依赖项