1. 程式人生 > 其它 >Hudi-核心概念(時間軸、檔案管理、索引)

Hudi-核心概念(時間軸、檔案管理、索引)

總述

hudi提供了hudi表的概念,這些表支援CRUD操作,可以利用現有的大資料叢集比如HDFS做資料檔案儲存,然後使用SparkSQL或Hive等分析引擎進行資料分析查詢 hudi表的三個主要元件 a.有序的時間軸元資料,類似於資料庫事務日誌 b.分層佈局的資料檔案:實際寫入表中的資料 c.索引(多種實現方式):對映包含指定記錄的資料集;資料有唯一主鍵,可快速定位資料

1.時間軸Timeline[核心]

在所有的表中維護了一個包含在不同的即時(Instant)時間對資料集操作(比如新增、修改或刪除)的時間軸(Timeline) 在每一次對hudi表的資料集操作時都會在該表的Timeline上生成一個Instant,從而可以實現在僅查詢某個時間點之後成功提交的資料,或是僅查詢某個時間點之前的資料,有效避免了掃描更大時間範圍的資料。 同時,可以高效的只查詢更改前的檔案(如在某個Instant提交了更改操作後,僅query某個時間點之前的資料,則仍可以query修改前的資料) Action: COMMITS:資料提交 CLEANS:資料刪除 DELTA_COMMIT: COMPACTION:小檔案合併 ROLLBACK:回滾 SAVEPOINT:儲存點 Timeline是hudi用來管理提交(commit)的抽象,每個commit都繫結一個固定時間戳,分散到時間線上。 在Timeline上,每個commit被抽象為一個HoodieInstant,一個instant記錄了一次提交(commit)的行為、時間戳和狀態 上圖中採用時間(小時)作為分割槽欄位,從10:00開始陸續產生各種commit,10:20來了一條9:00的資料,該資料仍然可以落到9:00對應的分割槽,通過timeline直接消費10:00之後的增量更新(只消費有新commits的group),那麼這條延遲的資料仍然可以被消費到 時間軸的實現類(位於hudi-common-xx.jar中),時間軸相關的實現類位於org.apache.hudi.common.table.timeline包下

2.檔案管理

hudi將DFS上的資料集組織到基本路徑(HodieWriteConfig.BASEPATHPROP)下的目錄結構中 資料集分為多個分割槽(DataSourceOptions.PARTITIONPATHFIELDOPT_KEY),這些分割槽與hive表非常相似,是包含該分割槽的資料檔案的資料夾 在每個分割槽內,檔案被組織為檔案組,由檔案ID充當唯一標識。每個檔案組包含多個檔案切片,其中每個切片包含在某個即時時間的提交/壓縮生成的基本列檔案(.parquet)以及一組日誌檔案(.log),該檔案包含自生成基本檔案依賴對基本檔案的插入/更新。 資料構成關係:table -> partition -> FileGroup -> FileSlice -> parquet + log hudi的base file(parquet檔案)在footer的meta去記錄了record key組成的BloomFilter,用於在file based index的實現中實現高效率的key contains檢測 hudi的log(arvo檔案)是自己編碼的,通過積攢資料buffer以LogBlock為單位寫出,每個LogBlock包含magic number、size、content、footer等資訊,用於資料讀、校驗和過濾

3.索引index

hudi通過索引機制提供高效的Upsert操作,該機制會將一個RecodeKey + PartitionPath組合的方式作為唯一標識對映到一個檔案ID,而且這個唯一標識和檔案組/檔案ID之間的對映自記錄被寫入檔案組開始就不會再改變。 3.1全域性索引:在全表的所有分割槽範圍下強制要求鍵保持唯一,即確保對給定的鍵有且只有一個對應的記錄。 3.2非全域性索引:僅在表的某一個分割槽內強制要求鍵保持唯一,它依靠寫入器為同一個記錄的更新、刪除提供一致的分割槽路徑