当前位置: 代码迷 >> 综合 >> Spark2.3 - 运行异常NoSuchMethodError:io.netty.buffer.PooledByteBufAllocator.metric()
  详细解决方案

Spark2.3 - 运行异常NoSuchMethodError:io.netty.buffer.PooledByteBufAllocator.metric()

热度:16   发布时间:2023-12-24 01:42:27.0

一、问题说明

在一个项目中同时引入了多个框架

hbase 1.4.1
kafka 1.1.0
spark 2.3.0

在以local模型运行spark示例程序的时候,出现如下报错:

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)at sql.SparkSqlMysqlDatasource$.main(SparkSqlMysqlDatasource.scala:29)at sql.SparkSqlMysqlDatasource.main(SparkSqlMysqlDatasource.scala)Process finished with exit code 1

二、问题分析

在通过搜索,根据:http://www.aboutyun.com/thread-24429-1-1.html 把问题定位到,可能是依赖中存在多个版本的 netty导致程序出现NoSuchMethodError异常。

接下来使用命令mvn dependency:tree >> log/dependency.log用于分析现在程序中已有的jar包依赖,通过搜索日志文件中发现:

1.org.apache.hbase:hbase-client:jar:1.4.1:compile中包含有io.netty:netty-all:jar:4.1.8.Final:compile jar包
2.org.apache.spark:spark-core_2.11:jar:2.3.0:compile中包含有io.netty:netty:jar:3.9.9.Final:compile
初步定位就是这两个jar包导致的冲突。

我首先采用的方案是使用 <exclusions></exclusions>标签剔除 spark-core 中所有的低版本的netty,无果。

后来发现在 stackoverflow 中有人发现类似的问题:https://stackoverflow.com/questions/49137397/spark-2-3-0-netty-version-issue-nosuchmethod-io-netty-buffer-pooledbytebufalloc?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

在这里面主要强调了一遍maven的传递依赖问题,https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html。

并且评论中的解决方法是使用<dependencyManagement></dependencyManagement>对于项目中的多版本进行管理,添加依赖如下:

<dependencyManagement><dependencies><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.18.Final</version></dependency></dependencies>
</dependencyManagement>

注: 这里的版本是根据 mvn 生成的日志文件中的 netty 的版本所确定的。

三、运行结果

在增添该配置以后,程序可以正常运行:
在这里插入图片描述

参考链接

https://blog.csdn.net/u011669700/article/details/80195886
https://blog.csdn.net/m0_37637511/article/details/80364391

spark相关文档

spark学习总结

  相关解决方案