什么是Hudi鸦难?
HUDI(Hadoop Upserts Deletes and Incrementals)是一個(gè)開(kāi)源的數(shù)據(jù)湖工具明刷,用于管理大規(guī)模數(shù)據(jù)湖中的數(shù)據(jù)满粗。
HUDI旨在解決數(shù)據(jù)湖中常見(jiàn)的一些挑戰(zhàn),如數(shù)據(jù)的增量更新挤聘、刪除和查詢(xún)等捅彻。它提供了一套API和工具,可以幫助用戶(hù)在數(shù)據(jù)湖中進(jìn)行寫(xiě)入从隆、更新缭裆、刪除和查詢(xún)等操作澈驼,并提供了高效的數(shù)據(jù)索引和存儲(chǔ)機(jī)制,以加速數(shù)據(jù)的訪(fǎng)問(wèn)和處理缝其。
HUDI的核心理念是將數(shù)據(jù)分為小的内边、可修改的單元,稱(chēng)為"寫(xiě)時(shí)復(fù)制(copy-on-write)"缭贡。當(dāng)數(shù)據(jù)需要更新或刪除時(shí),HUDI會(huì)創(chuàng)建一個(gè)新的數(shù)據(jù)文件谍失,而不是直接修改原始數(shù)據(jù)文件莹汤。這種設(shè)計(jì)可以保證數(shù)據(jù)的不可變性,同時(shí)提供了高效的增量更新和刪除操作抹竹。
HUDI還提供了用于數(shù)據(jù)管理的元數(shù)據(jù)存儲(chǔ)和查詢(xún)功能止潮,可以跟蹤數(shù)據(jù)的版本、變更歷史和元數(shù)據(jù)信息袄琳。這使得用戶(hù)可以輕松地追蹤和管理數(shù)據(jù)的變更燃乍,同時(shí)支持time-travel查詢(xún),即可以查詢(xún)數(shù)據(jù)在不同時(shí)間點(diǎn)的版本逗旁。
Hudi Timeline
Hudi timeline是HUDI用于跟蹤和管理數(shù)據(jù)變更歷史的一種機(jī)制片效。它記錄了數(shù)據(jù)湖中各個(gè)數(shù)據(jù)集的不同版本和變更操作英古,以及它們?cè)跁r(shí)間上的順序。
Timeline的核心概念是HUDI數(shù)據(jù)集的不可變性。每當(dāng)對(duì)HUDI數(shù)據(jù)集進(jìn)行寫(xiě)入箕戳、更新或刪除操作時(shí)陵吸,HUDI會(huì)創(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性穿。通過(guò)Timeline,用戶(hù)可以查詢(xún)數(shù)據(jù)集在不同時(shí)間點(diǎn)的版本吗坚,回溯到過(guò)去的數(shù)據(jù)狀態(tài)胯舷。
HUDI Timeline還提供了一些其他功能桑嘶,如支持增量數(shù)據(jù)拉取(incremental data pull)和增量數(shù)據(jù)合并(incremental data merge)讨便。增量數(shù)據(jù)拉取允許用戶(hù)只拉取數(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: 對(duì)于Hudi table的操作類(lèi)型;
- Instant time:操作發(fā)生時(shí)間戳(比如20190117010349)孽文;
- Instant state: Instant的當(dāng)前狀態(tài)。
Instant Action主要有以下幾種:
- COMMITS:commit表示將一批記錄原子的寫(xiě)入到hudi table中沉衣;
- CLEANS:刪除表中不再需要的舊版本文件楷掉,后臺(tái)活動(dòng)。
- DELTA_COMMIT:delta_commit指的是將一批記錄原子寫(xiě)入 MergeOnRead 類(lèi)型的表中斑鸦,其中一些/所有數(shù)據(jù)可以只寫(xiě)入delta logs草雕。
- COMPACTION: 將delta logs里的數(shù)據(jù)與parquet data files合并墩虹。
- ROLLBACK:表示commit/delta commit不成功并回滾,刪除在此類(lèi)寫(xiě)入期間產(chǎn)生的任何partial data files旬昭。
- SAVEPOINT:將某些file group標(biāo)記為“saved”菌湃,這樣cleaner就不會(huì)刪除它們惧所。 在發(fā)生災(zāi)難/數(shù)據(jù)恢復(fù)情況時(shí),它有助于將表恢復(fù)到timeline上的某個(gè)點(diǎn)纽绍。
Instant State主要有以下幾種:
- REQUESTED:表示已經(jīng)被scheduled势似,但尚未啟動(dòng)的操作。
- INFLIGHT:表示操作正在進(jìn)行辖佣。
- COMPLETED:表示操作已經(jīng)完成搓逾。
Hudi Table/Query Type
在Hudi中杯拐,有幾種常見(jiàn)的表類(lèi)型,用于滿(mǎn)足不同的數(shù)據(jù)管理和處理需求污淋。下面是Hudi中常見(jiàn)的表類(lèi)型:
- Copy-on-Write (COW)表:COW表是Hudi最基本的表類(lèi)型余掖。它采用了寫(xiě)時(shí)復(fù)制的策略冗美,每次更新操作都會(huì)創(chuàng)建一個(gè)新版本的完整數(shù)據(jù)集粉洼。新版本以一組新的文件形式存儲(chǔ),而原始數(shù)據(jù)保持不變安拟。COW表適合那些數(shù)據(jù)寫(xiě)入一次后多次讀取的場(chǎng)景宵喂。
-
Merge-on-Read (MOR)表:MOR表是Hudi引入的一種改進(jìn)型表類(lèi)型。它采用了基于讀取時(shí)合并的策略愉棱。數(shù)據(jù)被組織成基礎(chǔ)文件(base files)和日志文件(log files)奔滑∷成伲基礎(chǔ)文件包含不可變的數(shù)據(jù),而日志文件則記錄了基礎(chǔ)文件的增量更改梅猿。在查詢(xún)執(zhí)行期間秒裕,Hudi會(huì)動(dòng)態(tài)地合并基礎(chǔ)文件和日志文件几蜻,以提供一致的數(shù)據(jù)視圖体斩。MOR表適合那些需要頻繁更新和低延遲查詢(xún)的場(chǎng)景絮吵。
在Hudi中忱屑,有幾種常見(jiàn)的查詢(xún)類(lèi)型可以用來(lái)檢索和分析數(shù)據(jù)莺戒。下面是Hudi中常用的查詢(xún)類(lèi)型:
- Snapshot Query:Snapshot查詢(xún)是一種基于數(shù)據(jù)快照(Snapshot)的查詢(xún)方式。它可以獲取Hudi表中的某個(gè)commit或compaction的數(shù)據(jù)快照闹究,并以只讀方式進(jìn)行查詢(xún)和分析食店。通過(guò)指定特定的時(shí)間戳或快照ID吉嫩,可以獲取表在該時(shí)間點(diǎn)的一致視圖。
- Incremental Query:Hudi支持增量查詢(xún)用踩,即只查詢(xún)某個(gè)commit或compaction以來(lái)有變化的數(shù)據(jù)忙迁。增量查詢(xún)利用Hudi表的增量存儲(chǔ)和索引結(jié)構(gòu)姊扔,可以快速檢索到最新的變化數(shù)據(jù),避免全表掃描佛南,提高查詢(xún)效率嵌言。
-
Read Optimized Queries:查詢(xún)給定某個(gè)commit或compaction的snapshot摧茴。僅暴露file group中的base/columnar文件,不暴漏delta log文件尘分,以期獲得與非Hudi 列存表相同的查詢(xún)性能。
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)識(shí)恩掷。
- 每個(gè)file group包含多個(gè)file slices黄娘。
- 每個(gè)file slice包含在某個(gè)commit/compaction instant生成的base file(.parquet),以及一組delta log(.log.*)优床,這些delta log文件包含了自base file生成以來(lái)對(duì)base file的插入/更新操作誓焦。