从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冲突时可以同理处理
————————————————