博客 Nebula Exchange 从Hive导入 NoSuchMethodError

Nebula Exchange 从Hive导入 NoSuchMethodError

   数栈君   发表于 2024-02-28 10:48  86  0

从Hive导入guava版本冲突,重新打包exchange
环境
nebula 版本:3.2.0
hadoop 3.1.1
spark 2.4.3
hive 3.1.0
scala 2.11.12
exchange nebula-exchange_spark_2.4-3.0.0.jar

遇到问题

NoSuchMethodError: com.google.common.net.HostAndPort.getHostText()
NoSuchMethodError: com.google.common.base.Preconditions.checkArgument()
java.lang.NoClassDefFoundError: org/apache/commons/pool2/PooledObjectFactory
原因

exchange对guava-14.0强依赖,而spark集群使用的是guava-28.0-jre,guava-16以后不再向下兼容.
导致exchange和spark集群的guava互斥:
使用guava-28.0-jre 那么exchange会NoSuchMethodError: com.google.common.net.HostAndPort.getHostText
使用guava-14.0 那么spark集群会NoSuchMethodError: com.google.common.base.Preconditions.checkArgument
pool2.PooledObjectFactory 是client启动连接池, SPARK_HOME/jars下面没有2版本的,只有1版本的, 且exchange里没有对应依赖(exchange添加依赖commons-pool2-2.4.2 commons-dbcp2-2.1.1,或者SPARK_HOME/jars下面添加均可)
在linux环境下打包!!!
(windows下exchange打包会: scala-maven-plugin:4.4.0:compile: java.lang.NoSuchMethodError: org.fusesource.jansi.AnsiConsole.wrapOutputStream(Ljava/io/OutputStream;)Ljava/io/Output
Stream;
)

参考
特殊依赖:neo4j-spark-connector-2.4.5-M1.jar
代码地址

特别注意

# 在测试Spark 2.4时, 发现可以不用重新打包com.vesoft.client 3.0.1 (client-java-udf)也能正常运行
# 初步怀疑冲突是在spark_hive的连接时guava包冲突暴露
# 但是代码里的import com.google.common.被替换为了import com.google.common.udf.没有去加载client里面的guava-14
# 而在spark写nebula时使用的是client下面的guava-14

# 所以如果怕麻烦,可以只修改exchange里的guava依赖和代码(增加guava-udf(必须) commons-pool2-2.4.2(可选) commons-dbcp2-2.1.1(可选)依赖),
# 代码中: 包import com.google.common.geometry.{S2CellId, S2LatLng}不需要替换,虽然引用路径相同但这是独立工程,不会直接依赖guava
# com.vesoft.client可以使用官方的3.0.0版本,注意别用默认的SNAPSHOT,不使用自行打包的3.0.1版本

com.vesoft
client
3.0.0


1
2
3
4
5
6
7
8
9
10
11
12
13
14
安装自定义guava
# 可以自定义 pom.xml 中的 groupId,artifactId,version
# 可以自定义 pom.xml 中的 shadedPattern
cd guava-udf
mvn clean install -Dmaven.test.skip=true
1
2
3
4
安装client(可选)
# 将代码里的 import com.google.common. 替换为 import com.google.common.udf.
# 代码会爆红,但不影响打包/运行(如想避免代码爆红,guava-udf里不要使用com.google.common.前缀再接udf., 可以更换为,如: my.guava.common, 同步改groupId,artifactId)
cd client-java-udf
mvn clean install -Dmaven.test.skip=true
1
2
3
4
安装cexchange(注意: com.vesoft.client 版本按需调整)
# 代码替换时: 包 import com.google.common.geometry.{S2CellId, S2LatLng} 不需要替换
# 将代码里的其他的 import com.google.common. 替换为 import com.google.common.udf. 代码会爆红,但不影响打包/运行
# (如想避免代码爆红,guava-udf里不要使用com.google.common.前缀再接udf., 可以更换为,如: my.guava.common, 同步改groupId,artifactId)
# exchange-common增加依赖guava-udf(必须)
# 我的spark环境会NoClassDefFoundError: org/apache/commons/pool2/PooledObjectFactory,故添加 commons-pool2-2.4.2(可选) commons-dbcp2-2.1.1(可选)依赖
cd exchange-udf

# Spark 2.2:
mvn clean package -Dmaven.test.skip=true -Dgpg.skip -Dmaven.javadoc.skip=true -pl nebula-exchange_spark_2.2 -am -Pscala-2.11 -Pspark-2.2



# Spark 2.4:
mvn clean package -Dmaven.test.skip=true -Dgpg.skip -Dmaven.javadoc.skip=true -pl nebula-exchange_spark_2.4 -am -Pscala-2.11 -Pspark-2.4



# Spark 3.0:
mvn clean package -Dmaven.test.skip=true -Dgpg.skip -Dmaven.javadoc.skip=true -pl nebula-exchange_spark_3.0 -am -Pscala-2.12 -Pspark-3.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
nebula-spark-connector 运行guava冲突时可以同理处理
————————————————

本文系转载,版权归原作者SOUL-GIN笔记所有,链接:

https://blog.csdn.net/zxczb/article/details/126999031如若侵权请联系我们进行删除!

《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu

《数栈V6.0产品白皮书》下载地址:https://fs80.cn/cw0iw1

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=bbs

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:https://github.com/DTStack  

0条评论
上一篇:Hive-架构与设计
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群