Apache Hudi:把数据湖变成数据湖仓
Apache Hudi 在 GitHub 上拿到 6177 Star。
这个项目来自 Apache 基金会,做的一件事就是把数据湖升级成数据湖仓。在云存储上用开放格式存数据,同时提供入库、索引、存储、查询、转换和管理的全套能力。

1、解决什么问题
传统数据湖的痛点很明显:数据写进去容易,改起来难,查起来慢。
你往 S3 或 HDFS 上扔了一批 Parquet 文件,想做 upsert 怎么办?想查某条记录的变更历史怎么办?想在不阻塞写入的情况下做并发查询怎么办?这些问题靠原生文件系统解决不了,Hudi 就是在存储层和计算层之间加了这么一层。
它不替代 Spark 或 Flink,而是在它们下面垫了一层表格式(Table Format),让数据湖具备数据库才有的能力:原子提交、upsert、增量查询、时间旅行。
2、核心能力

写入侧,Hudi 支持 Spark 和 Flink 两个引擎。数据进来之后,自动做索引、管理文件大小和布局。upsert 和 delete 操作走记录级索引,速度很快。写入是原子的,支持回滚和恢复。
查询侧提供五种模式:快照查询看最新状态,增量查询看某段时间的变更,CDC 查询拿到完整的变更流(含修改前后的值),时间旅行查历史某一刻的数据,读优化查询用纯列存拿最佳性能。
存储侧做了不少优化。行存和列存都支持,文件大小和布局自动管理,有压缩和聚簇机制把小文件合并。Schema 支持演进,元数据用 timeline 记录每次变更。
3、怎么用
环境要求:Java 11 或 17,Maven 3.6 以上,Spark 3.3 到 4.2 或 Flink 1.18 到 2.1 都支持。
编译打包:
git clone https://github.com/apache/hudi.git && cd hudi
mvn clean package -DskipTests -Dspark3.5 -Dflink1.20
启动 Spark Shell:
spark-3.5.0-bin-hadoop3/bin/spark-shell \
--jars `ls packaging/hudi-spark-bundle/target/hudi-spark3.5-bundle_2.12-*.*.*-SNAPSHOT.jar` \
--conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \
--conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension' \
--conf 'spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog' \
--conf 'spark.kryo.registrator=org.apache.spark.HoodieSparkKryoRegistrar'
Scala 版本默认 2.12,Spark 3.5 及以上可以用 2.13。Spark 4.0 及以上需要 Java 17。
4、表管理
Hudi 的表服务是自动运行的,不需要手动维护。清理旧版本、压缩小文件、聚簇优化数据布局,这些都可以配置调度策略。
支持和 Hive Metastore、AWS Glue、Google BigQuery、Apache XTable 做 Catalog 同步,和现有的数据基础设施对接。
5、适合什么场景
数据量大、需要频繁更新的场景:实时数仓的 ODS 层,用 Hudi 做 upsert 比传统 overwrite 效率高很多。需要数据版本管理或合规审计的场景:时间旅行和 CDC 查询可以直接用。多引擎共存的场景:同一张表 Spark 和 Flink 都能读写,不用复制数据。
在做数据湖选型的团队,可以把 Hudi 和 Delta Lake、Iceberg 放在一起对比测试,三个项目各有侧重。
在做数据湖选型的团队,可以把 Hudi 和 Delta Lake、Iceberg 放在一起对比测试,三个项目各有侧重。
1445

被折叠的 条评论
为什么被折叠?



