更新时间:2026-08-17 GMT+08:00
分享

Hudi

在大数据场景中,传统HDFS文件系统以只读方式存储数据,难以直接支持数据的更新和删除操作。当用户需要对数据湖中的数据进行频繁的增删改查时,传统方案需要重写整个文件,效率较低。Hudi(Hadoop Upserts Deletes and Incrementals)是一种数据湖的存储格式,在Hadoop文件系统之上提供了更新数据和删除数据的能力以及消费变化数据的能力。支持多种计算引擎,提供IUD接口,在HDFS的数据集上提供了插入更新和增量拉取的功能。它支持多种计算引擎,提供IUD(Insert/Update/Delete)接口,在HDFS的数据集上实现了插入更新和增量拉取功能。

如需使用Hudi,请确保MRS集群内已安装Spark/Spark2x服务。

图1 Hudi基本架构

Hudi基本架构如上图所示。Hudi构建在HDFS之上,通过写入服务将数据写入Hudi数据集,通过读取服务提供多种视图供查询。Hudi内部通过索引机制定位记录、通过MVCC机制实现并发读写隔离、通过自动管理文件大小和布局优化查询性能。

Hudi特性

  • ACID事务能力:支持事务性的写入操作,确保数据一致性。支持实时入湖和批量入湖。
  • 多种视图能力(读优化视图/增量视图/实时视图),支持快速数据分析。
  • MVCC(Multi-Version Concurrency Control,多版本并发控制)设计:通过保留数据的多个版本,支持数据版本回溯,同时实现写入时可读取的并发隔离。
  • 自动管理文件大小和布局,以优化查询性能准实时摄取,为查询提供最新数据。
  • 支持并发读写,基于快照(Snapshot)隔离机制实现写入时可读取,不影响读操作的数据一致性。
  • 支持原地转表(schema evolution),将存量的历史表直接转换为Hudi数据集,无需重新导入数据。

Hudi关键技术和优势

  • 可插拔索引机制:Hudi提供多种索引机制(如Bloom Filter索引、HBase索引等),可以快速完成对海量数据的更新和删除操作。
  • 良好的生态支持:Hudi支持多种数据引擎接入包括Hive、Spark、Flink,用户可在熟悉的计算引擎中直接操作Hudi数据集。

Hudi支持两种表类型

Hudi提供两种表类型,分别适用于不同的写入和读取场景。用户可根据业务的读写频率和数据时效性要求选择合适的表类型。

  • Copy On Write

    写时复制表(也简称CoW表),使用parquet文件存储数据,内部的更新操作需要通过重写原始parquet文件完成。

    • 适用场景:读多写少的场景,对读取性能要求较高,且更新频率较低。
    • 优点:读取时,只读取对应分区的一个数据文件即可,较为高效。
    • 缺点:数据写入的时候,需要复制一个先前的副本再在其基础上生成新的数据文件,这个过程比较耗时。且由于耗时,读请求读取到的数据相对就会滞后。
  • Merge On Read

    读时合并表(也简称MoR表),使用列格式parquet和行格式Avro两种方式混合存储数据。其中parquet格式文件用于存储基础数据,Avro格式文件(也可叫做log文件)用于存储增量数据。

    • 适用场景:写多读少的场景,对写入性能要求较高,且能容忍一定的读取延迟。
    • 优点:由于写入数据先写delta log,且delta log较小,所以写入成本较低。
    • 缺点:需要定期合并整理compact,否则碎片文件较多。读取性能较差,因为需要将delta log和老数据文件合并。

Hudi支持三种视图,针对不同场景提供相应的读能力

Hudi针对不同查询场景提供三种视图类型,用户可根据数据时效性和查询性能的需求选择合适的视图。

  • Snapshot View

    实时视图:该视图提供当前Hudi表最新的快照数据,即一旦有最新的数据写入Hudi表,通过该视图就可以查出刚写入的新数据。

    CoW表和MoR表均支持这种视图能力。

    适用场景:需要获取最新数据的实时查询场景。

  • Incremental View

    增量视图:该视图提供增量查询的能力,可以查询指定COMMIT之后的增量数据,可用于快速拉取增量数据。

    CoW表支持该种视图能力, MoR表也可以支持该视图,但是一旦MoR表完成Compact操作其增量视图能力消失。

    适用场景:增量数据同步、CDC(Change Data Capture)等需要获取数据变更的场景。

  • Read Optimized View

    读优化视图:该视图只会提供最新版本的parquet文件中存储的数据。

    该视图在CoW表和MoR表上表现不同:

    对于CoW表,该视图能力和实时视图能力是一样的(CoW表只用parquet文件存数据)。

    对于MoR表,仅访问基本文件,提供给定文件片自上次执行Compact操作以来的数据。可简单理解为该视图只会提供MoR表parquet文件存储的数据,log文件里面的数据将被忽略。该视图数据并不一定是最新的,但是MoR表一旦完成Compact操作,增量log数据被合入到base数据中,此时该视图和实时视图能力一样。

    适用场景:对查询性能要求较高、对数据时效性要求不高的离线分析场景。

相关文档

更多关于Hudi组件操作指导,请参考使用Hudi

常见问题

  • 使用Hudi前需要安装哪些依赖服务?

    使用Hudi前,请确保MRS集群内已安装Spark或Spark2x服务。

  • CoW表和MoR表应该如何选择?

    如果业务场景以读取为主、更新较少,且对读取性能要求高,建议选择CoW表。如果业务场景写入频繁、对写入性能要求高,且能容忍一定的读取延迟,建议选择MoR表。

  • MoR表的增量视图能力为什么会消失?

    MoR表执行Compact操作后,增量log数据被合并到base数据文件中,原有的log文件不再存在,因此增量视图无法再从log文件中获取增量数据,增量视图能力随之消失。

相关文档