Hudi Spark写入出现NoSuchMethod HdfsD
2023-12-26 本文已影响0人
AlienPaul
环境信息
- Hudi:0.13.1
- Hadoop:3.1.1
问题背景
Spark 创建Hudi表的时候偶现如下错误:
java.lang.NoSuchMethodError: org.apache.hadoop.hdfs.client.HdfsDataInputStream.getReadStatistics()Lorg/apache/hadoop/hdfs/DFSInputStream$ReadStatistics;
无法成功写入。
问题原因
Hudi的metadata使用HBase的HFile格式存储。然而Hudi默认编译时候使用的HBase相关依赖包支持的Hadoop版本是2.x,和Hadoop 3.x存在兼容问题,导致出现NoSuchMethodError。
解决方案
编译Hudi的时候使用带有Hadoop 3.x依赖的HBase相关包。具体方法如下所示。或者参见Hudi 使用之 HBase Index。
首先需要编译HBase。执行:
git clone https://github.com/apache/hbase
进入源代码目录后checkout 2.4.9 tag(因为Hudi依赖的HBase为2.4.9,修改版本号会导致编译报错。不使用HBase Index的话,对于metadata HFile文件写入,使用和集群HBase版本不同的依赖不会有问题)。
git checkout rel/2.4.9
最后执行如下命令编译HBase。需要注意的是必须指定HBase依赖的Hadoop版本为3.0。
mvn clean install -Denforcer.skip -DskipTests -Dhadoop.profile=3.0 -Psite-install-step
到这里HBase编译完毕。接下来编译Hudi。
git clone https://github.com/apache/hudi.git
cd hudi
执行如下命令编译。以Flink 1.15和Spark 3.3为例:
mvn clean package -Dflink1.15 -Dscala2.12 -Dspark3.3 -DskipTests -Pflink-bundle-shade-hive3 -T 4 -Denforcer.skip
编译完毕之后替换原有的hudi-sparkx.x-bundle包,问题解决。