记一次Spark和Hbase的netty冲突

本文讲述了HBase和Spark由于netty-all依赖版本不同引发的NoSuchMethodError问题。通过分析依赖管理、最短路径原则和声明优先原则,作者给出了调整pom.xml的建议,包括调整包依赖顺序、排除hbase-client的netty-all和定义dependencyManagement来统一版本。
摘要由CSDN通过智能技术生成

问题描述

主要日志信息

Exception in thread “main” java.lang.NoSuchMethodError: io.netty.buffer.PooledByteBufAllocator.metric()Lio/netty/buffer/PooledByteBufAllocatorMetric;

原因分析:

这个是由于hbase和spark的netty-all依赖不同的版本引起的:

例如:pom文件中,hbase在spark core的前面

<dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-client</artifactId>
        <version>1.4.9</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.12</artifactId>
        <version>2.4.4</version>
        <scope>provided</scope>
    </dependency>

在这里插入图片描述

此时就会出现,spark和hbase 的netty的冲突 就会报 bug


maven对于重复依赖的处理

dependencyManagement标签中如果定义了重复依赖的版本,则导入此版本。
如果dependencyManagement中没有定义重复依赖的版本,则利用最短路径原则:

最短路径原则:

1,比如有如下两个依赖关系:
A -> B -> C -> D(V1)
F -> G -> D(V2)
这个时候项目中就出现了两个版本的D,这时maven会采用最短路径原则,选择V2版本的D,因为V1版本的D是由A包间接依赖的,整个依赖路径长度为3,而V2版本的D是由F包间接依赖的,整个依赖路径长度为2。

2,如果重复依赖的路径长度是相同的,则使用声明优先原则。比如:
A -> B -> D(V1)
F -> G -> D(V2)
这个时候因为两个版本的D的依赖路径都是一样长,最短路径原则就失效了。这个时候Maven的解决方案是:按照依赖包在
pom.xml中声明的先后顺序,优先选择先声明的包

再看上面的pom.xml导入的依赖,没有定义dependencyManagement标签。所以使用最短路径原则。
对于netty-all依赖,hbase-client和spark-core的依赖路径长度都是1,所以使用声明优先原则,
所以使用hbase-client中定义的netty-all依赖版本4.1.8。(上图中显示的spark-core依赖的nettt-all的版本是错误的,应该是4.1.17)。

由于最终导入了hbase-client依赖的4.1.8版本的netty-all,所以spark-core中的代码无法使用4.1.17版本中的函数,最终导致报错,找不到函数。

解决方案:

1,首先,把spark-core的包放在 hbase-client的前面,此时的依赖关系
在这里插入图片描述

2,把hbase-client的netty-all用标签排除

 <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-server</artifactId>
            <version>${hbase.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>netty-all</artifactId>
                    <groupId>io.netty</groupId>
                </exclusion>
            </exclusions>
</dependency>

3,然后定义dependencyManagement标签,声明netty-all版本

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

参考:
原文链接:https://blog.csdn.net/qq_41775852/article/details/105754222

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值