什么是Hudi?

HUDI(Hadoop Upserts Deletes and Incrementals)是一個(gè)開源的數(shù)據(jù)湖工具,用于管理大規(guī)模數(shù)據(jù)湖中的數(shù)據(jù)。
HUDI旨在解決數(shù)據(jù)湖中常見的一些挑戰(zhàn),如數(shù)據(jù)的增量更新、刪除和查詢等。它提供了一套API和工具,可以幫助用戶在數(shù)據(jù)湖中進(jìn)行寫入、更新、刪除和查詢等操作,并提供了高效的數(shù)據(jù)索引和存儲機(jī)制,以加速數(shù)據(jù)的訪問和處理。
HUDI的核心理念是將數(shù)據(jù)分為小的、可修改的單元,稱為"寫時(shí)復(fù)制(copy-on-write)"。當(dāng)數(shù)據(jù)需要更新或刪除時(shí),HUDI會創(chuàng)建一個(gè)新的數(shù)據(jù)文件,而不是直接修改原始數(shù)據(jù)文件。這種設(shè)計(jì)可以保證數(shù)據(jù)的不可變性,同時(shí)提供了高效的增量更新和刪除操作。
HUDI還提供了用于數(shù)據(jù)管理的元數(shù)據(jù)存儲和查詢功能,可以跟蹤數(shù)據(jù)的版本、變更歷史和元數(shù)據(jù)信息。這使得用戶可以輕松地追蹤和管理數(shù)據(jù)的變更,同時(shí)支持time-travel查詢,即可以查詢數(shù)據(jù)在不同時(shí)間點(diǎn)的版本。
Hudi Timeline
Hudi timeline是HUDI用于跟蹤和管理數(shù)據(jù)變更歷史的一種機(jī)制。它記錄了數(shù)據(jù)湖中各個(gè)數(shù)據(jù)集的不同版本和變更操作,以及它們在時(shí)間上的順序。
Timeline的核心概念是HUDI數(shù)據(jù)集的不可變性。每當(dāng)對HUDI數(shù)據(jù)集進(jìn)行寫入、更新或刪除操作時(shí),HUDI會創(chuàng)建一個(gè)新的數(shù)據(jù)文件或目錄,而不是直接修改原始數(shù)據(jù)文件。每個(gè)數(shù)據(jù)文件或目錄都被分配一個(gè)唯一的時(shí)間戳,用于表示它的創(chuàng)建時(shí)間。
Timeline維護(hù)了所有數(shù)據(jù)文件和目錄的時(shí)間戳信息,并按照時(shí)間順序組織它們。這使得HUDI能夠追蹤數(shù)據(jù)集的完整變更歷史,并支持time-travel query。通過Timeline,用戶可以查詢數(shù)據(jù)集在不同時(shí)間點(diǎn)的版本,回溯到過去的數(shù)據(jù)狀態(tài)。
HUDI Timeline還提供了一些其他功能,如支持增量數(shù)據(jù)拉?。╥ncremental data pull)和增量數(shù)據(jù)合并(incremental data merge)。增量數(shù)據(jù)拉取允許用戶只拉取數(shù)據(jù)集中發(fā)生變化的部分,而不必處理整個(gè)數(shù)據(jù)集。增量數(shù)據(jù)合并則可以將多個(gè)HUDI數(shù)據(jù)集合并為一個(gè)數(shù)據(jù)集,并保持?jǐn)?shù)據(jù)的一致性和有序性。
Hudi的Timeline由一系列按時(shí)間順序的Instants組成,Instant有下面三部分:
- Instant action: 對于Hudi table的操作類型;
- Instant time:操作發(fā)生時(shí)間戳(比如20190117010349);
- Instant state: Instant的當(dāng)前狀態(tài)。
Instant Action主要有以下幾種:
- COMMITS:commit表示將一批記錄原子的寫入到hudi table中;
- CLEANS:刪除表中不再需要的舊版本文件,后臺活動。
- DELTA_COMMIT:delta_commit指的是將一批記錄原子寫入 MergeOnRead 類型的表中,其中一些/所有數(shù)據(jù)可以只寫入delta logs。
- COMPACTION: 將delta logs里的數(shù)據(jù)與parquet data files合并。
- ROLLBACK:表示commit/delta commit不成功并回滾,刪除在此類寫入期間產(chǎn)生的任何partial data files。
- SAVEPOINT:將某些file group標(biāo)記為“saved”,這樣cleaner就不會刪除它們。 在發(fā)生災(zāi)難/數(shù)據(jù)恢復(fù)情況時(shí),它有助于將表恢復(fù)到timeline上的某個(gè)點(diǎn)。
Instant State主要有以下幾種:
- REQUESTED:表示已經(jīng)被scheduled,但尚未啟動的操作。
- INFLIGHT:表示操作正在進(jìn)行。
- COMPLETED:表示操作已經(jīng)完成。
Hudi Table/Query Type
在Hudi中,有幾種常見的表類型,用于滿足不同的數(shù)據(jù)管理和處理需求。下面是Hudi中常見的表類型:
- Copy-on-Write (COW)表:COW表是Hudi最基本的表類型。它采用了寫時(shí)復(fù)制的策略,每次更新操作都會創(chuàng)建一個(gè)新版本的完整數(shù)據(jù)集。新版本以一組新的文件形式存儲,而原始數(shù)據(jù)保持不變。COW表適合那些數(shù)據(jù)寫入一次后多次讀取的場景。
-
Merge-on-Read (MOR)表:MOR表是Hudi引入的一種改進(jìn)型表類型。它采用了基于讀取時(shí)合并的策略。數(shù)據(jù)被組織成基礎(chǔ)文件(base files)和日志文件(log files)?;A(chǔ)文件包含不可變的數(shù)據(jù),而日志文件則記錄了基礎(chǔ)文件的增量更改。在查詢執(zhí)行期間,Hudi會動態(tài)地合并基礎(chǔ)文件和日志文件,以提供一致的數(shù)據(jù)視圖。MOR表適合那些需要頻繁更新和低延遲查詢的場景。
image.png
在Hudi中,有幾種常見的查詢類型可以用來檢索和分析數(shù)據(jù)。下面是Hudi中常用的查詢類型:
- Snapshot Query:Snapshot查詢是一種基于數(shù)據(jù)快照(Snapshot)的查詢方式。它可以獲取Hudi表中的某個(gè)commit或compaction的數(shù)據(jù)快照,并以只讀方式進(jìn)行查詢和分析。通過指定特定的時(shí)間戳或快照ID,可以獲取表在該時(shí)間點(diǎn)的一致視圖。
- Incremental Query:Hudi支持增量查詢,即只查詢某個(gè)commit或compaction以來有變化的數(shù)據(jù)。增量查詢利用Hudi表的增量存儲和索引結(jié)構(gòu),可以快速檢索到最新的變化數(shù)據(jù),避免全表掃描,提高查詢效率。
-
Read Optimized Queries:查詢給定某個(gè)commit或compaction的snapshot。僅暴露file group中的base/columnar文件,不暴漏delta log文件,以期獲得與非Hudi 列存表相同的查詢性能。
image.png
Hudi File Layout
- Hudi將數(shù)據(jù)表組織成分布式文件系統(tǒng)上base path下的目錄結(jié)構(gòu)。
- 表被分割成多個(gè)partition。
- 在每個(gè)partition內(nèi),文件被組織成file group,由file ID唯一標(biāo)識。
- 每個(gè)file group包含多個(gè)file slices。
- 每個(gè)file slice包含在某個(gè)commit/compaction instant生成的base file(.parquet),以及一組delta log(.log.*),這些delta log文件包含了自base file生成以來對base file的插入/更新操作。

