什么是Hudi?
HUDI(Hadoop Upserts Deletes and Incrementals)是一个开源的数据湖工具,用于管理大规模数据湖中的数据。
HUDI旨在解决数据湖中常见的一些挑战,如数据的增量更新、删除和查询等。它提供了一套API和工具,可以帮助用户在数据湖中进行写入、更新、删除和查询等操作,并提供了高效的数据索引和存储机制,以加速数据的访问和处理。
HUDI的核心理念是将数据分为小的、可修改的单元,称为"写时复制(copy-on-write)"。当数据需要更新或删除时,HUDI会创建一个新的数据文件,而不是直接修改原始数据文件。这种设计可以保证数据的不可变性,同时提供了高效的增量更新和删除操作。
HUDI还提供了用于数据管理的元数据存储和查询功能,可以跟踪数据的版本、变更历史和元数据信息。这使得用户可以轻松地追踪和管理数据的变更,同时支持time-travel查询,即可以查询数据在不同时间点的版本。
Hudi Timeline
Hudi timeline是HUDI用于跟踪和管理数据变更历史的一种机制。它记录了数据湖中各个数据集的不同版本和变更操作,以及它们在时间上的顺序。
Timeline的核心概念是HUDI数据集的不可变性。每当对HUDI数据集进行写入、更新或删除操作时,HUDI会创建一个新的数据文件或目录,而不是直接修改原始数据文件。每个数据文件或目录都被分配一个唯一的时间戳,用于表示它的创建时间。
Timeline维护了所有数据文件和目录的时间戳信息,并按照时间顺序组织它们。这使得HUDI能够追踪数据集的完整变更历史,并支持time-travel query。通过Timeline,用户可以查询数据集在不同时间点的版本,回溯到过去的数据状态。
HUDI Timeline还提供了一些其他功能,如支持增量数据拉取(incremental data pull)和增量数据合并(incremental data merge)。增量数据拉取允许用户只拉取数据集中发生变化的部分,而不必处理整个数据集。增量数据合并则可以将多个HUDI数据集合并为一个数据集,并保持数据的一致性和有序性。
Hudi的Timeline由一系列按时间顺序的Instants
组成,Instant有下面三部分:
- Instant action: 对于Hudi table的操作类型;
- Instant time:操作发生时间戳(比如20190117010349);
- Instant state: Instant的当前状态。
Instant Action主要有以下几种:
- COMMITS:commit表示将一批记录原子的写入到hudi table中;
- CLEANS:删除表中不再需要的旧版本文件,后台活动。
- DELTA_COMMIT:delta_commit指的是将一批记录原子写入 MergeOnRead 类型的表中,其中一些/所有数据可以只写入delta logs。
- COMPACTION: 将delta logs里的数据与parquet data files合并。
- ROLLBACK:表示commit/delta commit不成功并回滚,删除在此类写入期间产生的任何partial data files。
- SAVEPOINT:将某些file group标记为“saved”,这样cleaner就不会删除它们。 在发生灾难/数据恢复情况时,它有助于将表恢复到timeline上的某个点。
Instant State主要有以下几种:
- REQUESTED:表示已经被scheduled,但尚未启动的操作。
- INFLIGHT:表示操作正在进行。
- COMPLETED:表示操作已经完成。
Hudi Table/Query Type
在Hudi中,有几种常见的表类型,用于满足不同的数据管理和处理需求。下面是Hudi中常见的表类型:
- Copy-on-Write (COW)表:COW表是Hudi最基本的表类型。它采用了写时复制的策略,每次更新操作都会创建一个新版本的完整数据集。新版本以一组新的文件形式存储,而原始数据保持不变。COW表适合那些数据写入一次后多次读取的场景。
-
Merge-on-Read (MOR)表:MOR表是Hudi引入的一种改进型表类型。它采用了基于读取时合并的策略。数据被组织成基础文件(base files)和日志文件(log files)。基础文件包含不可变的数据,而日志文件则记录了基础文件的增量更改。在查询执行期间,Hudi会动态地合并基础文件和日志文件,以提供一致的数据视图。MOR表适合那些需要频繁更新和低延迟查询的场景。
在Hudi中,有几种常见的查询类型可以用来检索和分析数据。下面是Hudi中常用的查询类型:
- Snapshot Query:Snapshot查询是一种基于数据快照(Snapshot)的查询方式。它可以获取Hudi表中的某个commit或compaction的数据快照,并以只读方式进行查询和分析。通过指定特定的时间戳或快照ID,可以获取表在该时间点的一致视图。
- Incremental Query:Hudi支持增量查询,即只查询某个commit或compaction以来有变化的数据。增量查询利用Hudi表的增量存储和索引结构,可以快速检索到最新的变化数据,避免全表扫描,提高查询效率。
-
Read Optimized Queries:查询给定某个commit或compaction的snapshot。仅暴露file group中的base/columnar文件,不暴漏delta log文件,以期获得与非Hudi 列存表相同的查询性能。
Hudi File Layout
- Hudi将数据表组织成分布式文件系统上base path下的目录结构。
- 表被分割成多个partition。
- 在每个partition内,文件被组织成file group,由file ID唯一标识。
- 每个file group包含多个file slices。
- 每个file slice包含在某个commit/compaction instant生成的base file(.parquet),以及一组delta log(.log.*),这些delta log文件包含了自base file生成以来对base file的插入/更新操作。