一、問題說明
在一個項目中同時引入了多個框架
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