Apache Hudi是一种数据湖的存储格式,在Hadoop文件系统之上提供了更新数据和删除数据的能力以及消费变化数据的能力。

Hudi表类型

Hudi支持如下两种表类型:

  • Copy On Write

    使用Parquet格式存储数据。Copy On Write表的更新操作需要通过重写实现。

  • Merge On Read

    使用列式文件格式(Parquet)和行式文件格式(Avro)混合的方式来存储数据。Merge On Read使用列式格式存放Base数据,同时使用行式格式存放增量数据。最新写入的增量数据存放至行式文件中,根据可配置的策略执行COMPACTION操作合并增量数据至列式文件中。

针对不同表类型的差异点如下表所示。

Trade-off

Copy On Write

Merge On Read

Data Latency

Query Latency

Update cost (I/O)

高(重写整个Parquet)

Lower(追加到Delta Log)

Parquet File Size

小 (高更新(I/O)开销)

大(低更新开销)

Write Amplification

高(写放大较高)

低(取决于合并策略)

Hudi查询类型

Hudi支持如下三种查询类型:

  • Snapshot Queries

    可以查询最新COMMIT的快照数据。针对Merge On Read类型的表,查询时需要在线合并列存中的Base数据和日志中的实时数据;针对Copy On Write表,可以查询最新版本的Parquet数据。

    Copy On Write和Merge On Read表支持该类型的查询。

  • Incremental Queries

    支持增量查询的能力,可以查询给定COMMIT之后的最新数据。

    Copy On Write和Merge On Read表支持该类型的查询。

  • Read Optimized Queries

    只能查询到给定COMMIT之前所限定范围的最新数据。Read Optimized Queries是对Merge On Read表类型快照查询的优化,通过牺牲查询数据的时效性,来减少在线合并日志数据产生的查询延迟。

针对不同查询类型的差异点如下表所示。

Trade-off

Snapshort Queries

Read Optimized Queries

Data Latency

Query Latency

对于Merge On Read类型,高

应用场景

  • 近实时数据摄取

    Hudi支持插入、更新和删除数据的能力。您可以实时摄取消息队列(Kafka)和日志服务SLS等日志数据至Hudi中,同时也支持实时同步数据库Binlog产生的变更数据。

    Hudi优化了数据写入过程中产生的小文件。因此,相比其他传统的文件格式,Hudi对HDFS文件系统更加的友好。

  • 近实时数据分析

    Hudi支持多种数据分析引擎,包括Hive、Spark、Presto和Impala。Hudi作为一种文件格式,不需要依赖额外的服务进程,在使用上也更加的轻量化。

  • 增量数据处理

    Hudi支持Incremental Query查询类型,您可以通过Spark Streaming查询给定COMMIT后发生变更的数据。Hudi提供了一种消费HDFS变化数据的能力,可以用来优化现有的系统架构。