欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

spark和elasticsearch共存项目,AbstractMethodError错误的解决记录

时间:2023-05-04
【前提】 我们的项目是一个父子项目,基本上每个子项目都依赖了org.apache.spark:spark-core_2.11:2.1.1; 其中个别子项目除了依赖spark-core_2.11外,还依赖org.elasticsearch.client:transport:5.6.2 【现象】 包编译正常,但在linux环境下运行时,引用了elasticsearch的模块运行正常;其它未引用的模块执行时报下面的错误。 java.lang.AbstractMethodError: io.netty.util.concurrent.MultithreadEventExecutorGroup.newChild(....) 【网上资源】 网上有对此问题的分析,比较好的帖子: https://blog.csdn.net/blomule/article/details/43058111

https://blog.csdn.net/jiahao1186/article/details/97899713

【问题解决】 根据网上帖子的说明,进入父项目有pom.xml文件的目录,执行以下命令看到所有子项目对第三方包的依赖关系,也可以进行某个子项目有pom.xml文件的目录,执行下面命令,只查看该子项目对第三方包的依赖关系: mvn dependency:tree -Dverbose 结合网上资源的说明,大致了解问题的原因: org.apache.spark:spark-core_2.11:2.1.1 依赖: io-netty:netty-all:jar:4.0.42 org.elasticsearch.client:transport:5.6.2 依赖:
io.netty:netty-buffer:4.1.13, io.netty:netty-codec:4.1.13, io.netty:netty-common:4.1.13 ...等 个人猜测: netty-all 与 io.netty:netty-buffer:4.1.13 + io.netty:netty-codec:4.1.13 + io.netty:netty-common:4.1.13是等同的,但两者间有某个类或者方法的定义发生了改变。具体原因未知。 最终解决修改: step1: 父项目的pom.xml文件中,添加如下项:
            ...                     org.elasticsearch.client             transport             5.6.2                                                 io.netty                     netty-buffer                                                     io.netty                     netty-codec                                                     io.netty                     netty-codec-http                                                     io.netty                     netty-common                                                     io.netty                     netty-handler                                                     io.netty                     netty-resolver                                                     io.netty                     netty-transport                                             ...    
两点说明: 1) 在dependencyManagement中的依赖,只是定义,并没有真正的引入 2) 上面挨个排除了netty-buffer、netty-codec、netty-common等,不能使用*或netty-*方式 step2: 在使用elasticsearch子项目的pom.xml文件中,正常引入即可
    org.elasticsearch.client     transport
说明: 也可以step1不做,这样的话,step2中就需要增加exclusions信息;并且每个引用了elasticsearch子项目的pom.xml文件中都需要做相同的设置。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。