记hudi 3.3.x 0.14.1的NoSuchMethod问题
问题
近期在研究Hudi。在开发环境下使用基本上没有什么问题。结果跑到生产线时遇到各类奇怪的问题。其中影响时间最长的还是NoSuchMethod
的问题。其错误如下。
ava.util.concurrent.CompletionException: java.lang.NoSuchMethodError: org.apache.hadoop.hdfs.client.HdfsDataInputStream.getReadStatistics()Lorg/apache/hadoop/hdfs/DFSInputStream$ReadStatistics;
04-06-2024 15:17:22 CST hudi-test INFO - at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273)
04-06-2024 15:17:22 CST hudi-test INFO - at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:991)
在网络上搜索一翻后,发现这个问题非常的共性。产生的主要原因还是在于Hudi
这一版本引用的HBase是2.4.9
,该版本的Hbase引用的Hadoop是2.x版本导致与生产线的3.x Hadoop不兼容。重新编译就好了。
问题解决
重新编译HBase
# 编译HBase
git clone https://github.com/apache/hbase
git checkout rel/2.4.9
mvn clean install -Denforcer.skip -DskipTests -Dhadoop.profile=3.0 -Psite-install-step -Dos.arch=x86_64
这里特别说明我使用的是m1 chip macbook
,直接编译是会报错的。需要改一下系统:-Dos.arch=x86_64
,当然网友也有其他的方法进行处理。这里简单点处理更直接一些。
重新编译Hudi
git clone https://github.com/apache/hudi.git
git checkout release-0.14.1
#此时需要修改pom.xml
这里特别说明,必须要checkout release-0.14.1
这个版本。
调整POM
注释掉relocation
这一行,如下图示:
执行编译
mvn clean package -Dflink1.15 -Dscala2.12 -Dspark3.3 -DskipTests -Pflink-bundle-shade-hive3 -T 4 -Denforcer.skip -Dos.arch=x86_64
编译完成
编译的结果在这个文件夹里面:
packaging/hudi-spark-bundle/target/hudi-spark3.3-bundle_2.12-0.14.1.jar
至此再上传后,运行HudiTest,就成功了。