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非全局索引:僅在表的某一個分區內強制要求鍵保持唯一,它依靠寫入器為同一個記錄的更新、刪除提供一致的分區路徑
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM