第8节 hudi 0.9编译 在flink 1.12.2中测试发现guava 冲突

hadoop 版本 apache hadoop 3.1.3

hive 版本 apache hive 3.1.2

flink 版本 1.12.2

hudi 0.9.0

编译hudi后 测试flink sql 操作,insert数据发生错误

com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V

Caused by: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
        at org.apache.hadoop.conf.Configuration.set(Configuration.java:1357) ~[hadoop-common-3.1.3.jar:?]
        at org.apache.hadoop.conf.Configuration.set(Configuration.java:1338) ~[hadoop-common-3.1.3.jar:?]
        at org.apache.hadoop.conf.Configuration.setClass(Configuration.java:2713) ~[hadoop-common-3.1.3.jar:?]
        at org.apache.hadoop.ipc.RPC.setProtocolEngine(RPC.java:203) ~[hadoop-common-3.1.3.jar:?]
        at org.apache.hadoop.hdfs.NameNodeProxiesClient.createProxyWithAlignmentContext(NameNodeProxiesClient.java:358) ~[hadoop-hdfs-client-3.1.3.jar:?]
        at org.apache.hadoop.hdfs.NameNodeProxiesClient.createNonHAProxyWithClientProtocol(NameNodeProxiesClient.java:349) ~[hadoop-hdfs-client-3.1.3.jar
:?]
        at org.apache.hadoop.hdfs.NameNodeProxiesClient.createProxyWithClientProtocol(NameNodeProxiesClient.java:141) ~[hadoop-hdfs-client-3.1.3.jar:?]
        at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:355) ~[hadoop-hdfs-client-3.1.3.jar:?]
        at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:289) ~[hadoop-hdfs-client-3.1.3.jar:?]
        at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:172) ~[hadoop-hdfs-client-3.1.3.jar:?]
        at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3303) ~[hadoop-common-3.1.3.jar:?]
        at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:124) ~[hadoop-common-3.1.3.jar:?]
        at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:3352) ~[hadoop-common-3.1.3.jar:?]
        at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3320) ~[hadoop-common-3.1.3.jar:?]
        at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:479) ~[hadoop-common-3.1.3.jar:?]
        at org.apache.hadoop.fs.Path.getFileSystem(Path.java:361) ~[hadoop-common-3.1.3.jar:?]
        at org.apache.hudi.common.fs.FSUtils.getFs(FSUtils.java:99) ~[hudi-flink-bundle_2.12-0.9.0.jar:0.9.0]
        at org.apache.hudi.client.AbstractHoodieClient.<init>(AbstractHoodieClient.java:69) ~[hudi-flink-bundle_2.12-0.9.0.jar:0.9.0]
        at org.apache.hudi.client.AbstractHoodieWriteClient.<init>(AbstractHoodieWriteClient.java:133) ~[hudi-flink-bundle_2.12-0.9.0.jar:0.9.0]
        at org.apache.hudi.client.AbstractHoodieWriteClient.<init>(AbstractHoodieWriteClient.java:121) ~[hudi-flink-bundle_2.12-0.9.0.jar:0.9.0]
        at org.apache.hudi.client.HoodieFlinkWriteClient.<init>(HoodieFlinkWriteClient.java:99) ~[hudi-flink-bundle_2.12-0.9.0.jar:0.9.0]

查询发现是guava 造成的版本不兼容,查看hadoop 和hive lib 后发现guava都是 27.0-jar版本

造成guava 版本不兼容的地方是hive-exec-xxx.jar 在hudi-flink-bundle_2.12-0.9.0.jar中被引用了

默认情况下hudi 0.9使用的hive version (在Hudi/pom.xml下查看) 是2.3.1 编译后通过查看

vim hudi-flink-bundle_2.12-0.9.0.jar

:/guava

可以查看到guava 引用的版本是14.0.1版本 与在hadoop环境的27.0不兼容

两种解决方案:

1. 修改flink 中与flink相关的pom.xml文件

 将Hudi/pom.xml 中的hadoop hive 修改版本

<!--<hadoop.version>2.7.3</hadoop.version>-->
    <hadoop.version>3.1.3</hadoop.version>
<!--<hive.version>2.3.1</hive.version>-->
    <hive.version>3.1.2</hive.version>

 将/data/software/Hudi/packaging/hudi-flink-bundle/pom.xml

<!--<hive.version>2.3.1</hive.version>-->注释掉

 <!--<include>org.apache.hive:hive-exec</include>--> 注释掉

 

 这样hudi-flink 打包就不会依赖到hive-exec

重新编译hudi

mvn clean package -DskipTests -Dspark3 -Dscala-2.12

将hudi-flink-bundle_2.12-0.9.0.jar 放入 flink/lib 下 重启flink服务,flink-sql插入数据不报错

2. 重新编译hive源码 修改hive-exec源码下依赖guava的pom.xml

wget https://dlcdn.apache.org/hive/hive-3.1.2/apache-hive-3.1.2-src.tar.gz --no-check-c

tar zxvf apache-hive-3.1.2-src.tar.gz

cd apache-hive-3.1.2-src/

vim ql/pom.xml

注释掉这个include

<!--<include>com.google.guava:guava</include>-->

指定编译那个模块hive-exec

mvn clean package -Pdist -DskipTests -pl ql

编译后将形成的hive-exec-3.1.2.jar 放到maven 本地仓库中

/root/.m2/repository/org/apache/hive/hive-exec/3.1.2

/root/.m2/repository/org/apache/hive/hive-exec/3.1.2
[root@cdh06 3.1.2]# ll
总用量 97252
-rw-r--r-- 1 root root 12609018 10月 12 11:07 hive-exec-3.1.2-core.jar
-rw-r--r-- 1 root root       40 10月 12 11:07 hive-exec-3.1.2-core.jar.sha1
-rw-r--r-- 1 root root 38317402 10月 12 17:07 hive-exec-3.1.2.jar
-rw-r--r-- 1 root root 40623959 10月 12 11:08 hive-exec-3.1.2.jar.back
-rw-r--r-- 1 root root       40 10月 12 11:08 hive-exec-3.1.2.jar.sha1
-rw-r--r-- 1 root root    35480 10月 12 11:07 hive-exec-3.1.2.pom
-rw-r--r-- 1 root root       40 10月 12 11:07 hive-exec-3.1.2.pom.sha1
-rw-r--r-- 1 root root  7971633 10月 12 11:12 hive-exec-3.1.2-sources.jar
-rw-r--r-- 1 root root       40 10月 12 11:12 hive-exec-3.1.2-sources.jar.sha1
-rw-r--r-- 1 root root      365 10月 12 14:57 _remote.repositories

将原有的3.1.2版本的hive-exec-3.1.2.jar 重命名放在旁边,由于从maven 仓库拉取到的hive-exec-3.1.2.jar 本身引用的guava就是19.0,现在重新编译时将include 中的guava包注释掉,这样新的hive-exec-3.1.2.jar中就找不到guava的依赖,

Hudi直接编译 这样hudi-flink-bundle模块引用的hive-exec 它会读取maven仓中的hive-exec

但是maven仓中的我们已经替换为注释掉include重新编译的新jar ,所以直接hudi 打包形成的

hudi-flink-bundle_2.12-0.9.0.jar 中不含有 guava的依赖

也可以修改提高hudi中hadoop与hive的版本 在hudi/pom.xml 中hadoop, hive 版本后和packageing/hudi-flink-xxx/pom.xml 下 注释掉hive-version

让引用父pom 重新编译hudi 将hudi-flink-bunndle-xxx.jar 放入flink/lib 重启,可以解决guava版本不兼容问题问题

参考资料

Hadoop3.1.3 ,hive-3.1.2,flink1.12.0由guava的jar包版本不一致导致的兼容性问题_chenshijie2011的专栏-CSDN博客

Hadoop和hive-exec-3.1.2的Guava的版本冲突导致Flink任务启动异常_FishMAN_已存在的博客-CSDN博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值