环境:Hudi: 0.14
Spark: 3.4
HBase: 2.4.9
Hadoop: 3
在使用 Hudi 建表和插入数据到 HDFS 时, 出现错误:
Caused by: java.lang.NoSuchMethodError: org.apache.hadoop.hdfs.client.HdfsDataInputStream.getReadStatistics()Lorg/apache/hadoop/hdfs/DFSInputStream$ReadStatistics; |
这种一看像是版本兼容问题, 已经有用户遇到过,
是 Hudi 使用的 HBase, 其依赖的 Hadoop 版本为 v2,
和 v3 存在兼容问题, 需要下载源码重新编译.
接下来, 进行重新编译打包.
下载 hudi 源码
git clone https://github.com/apache/hudi.git |
可以看到使用的依赖版本:
<hadoop.version>2.10.2</hadoop.version> |
下载 HBase 源码, 重编译
重编译和 install :
git clone https://github.com/apache/hbase |
重编译 hudi
mvn clean package -Dflink1.17 -Dspark3.4 -DskipTests |
编译错误:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) on project hudi-common: Compilation failure: Compilation failure: |
这个是 Java Version 高于 1.8 导致的问题, 改回 1.8 即可.
注意: HBase 的编译最好也用 1.8 进行, 避免出现这样的错误:
java.lang.NoSuchMethodError: java.nio.ByteBuffer.position(I)Ljava/nio/ByteBuffer;.
编译和 package 之后, 得到 hudi-spark3.4-bundle.jar, 复制使用即可.
Spark 测试
启动 Spark Shell :
(--jars 参数加上了上面我们重新编译的 hudi bundle 包)
export SPARK_VERSION=3.4 |
插入数据:
import scala.collection.JavaConversions._ |
查询数据:
val tripsDF = spark.read.format("hudi").load(basePath) |
OK, Hudi 写入到 Hadoop 3 HDFS 完成.