閱識風雲是華為雲信息大咖,擅長將複雜信息多元化呈現,其出品的一張圖(雲圖說)、深入淺出的博文(雲小課)或短視頻(雲視廳)總有一款能讓您快速上手華為雲。更多精彩內容請單擊此處。 摘要:Hudi是數據湖的文件組織層,對Parquet格式文件進行管理提供數據湖能力,支持多種計算引擎。 本文分享自華為雲社區 ...
閱識風雲是華為雲信息大咖,擅長將複雜信息多元化呈現,其出品的一張圖(雲圖說)、深入淺出的博文(雲小課)或短視頻(雲視廳)總有一款能讓您快速上手華為雲。更多精彩內容請單擊此處。
摘要:Hudi是數據湖的文件組織層,對Parquet格式文件進行管理提供數據湖能力,支持多種計算引擎。
本文分享自華為雲社區《【雲小課】EI第39課 MRS基礎原理之Hudi介紹》,作者:Hello EI 。
Hudi是數據湖的文件組織層,對Parquet格式文件進行管理提供數據湖能力,支持多種計算引擎,提供IUD介面,在 HDFS的數據集上提供了插入更新和增量拉取的流原語。
Hudi結構
Hudi的架構如圖1-1所示。
Hudi支持兩種表類型
Copy On Write
寫時複製表也簡稱cow表,使用parquet文件存儲數據,內部的更新操作需要通過重寫原始parquet文件完成。
- 優點:讀取時,只讀取對應分區的一個數據文件即可,較為高效。
- 缺點:數據寫入的時候,需要複製一個先前的副本再在其基礎上生成新的數據文件,這個過程比較耗時。且由於耗時,讀請求讀取到的數據相對就會滯後。
Merge On Read
讀時合併表也簡稱mor表,使用列格式parquet和行格式Avro兩種方式混合存儲數據。其中parquet格式文件用於存儲基礎數據,Avro格式文件(也可叫做log文件)用於存儲增量數據。
- 優點:由於寫入數據先寫delta log,且delta log較小,所以寫入成本較低。
- 缺點:需要定期合併整理compact,否則碎片文件較多。讀取性能較差,因為需要將delta log和老數據文件合併。
Hudi支持三種視圖,針對不同場景提供相應的讀能力
Snapshot View
實時視圖:該視圖提供當前hudi表最新的快照數據,即一旦有最新的數據寫入hudi表,通過該視圖就可以查出剛寫入的新數據。
cow表和mor均支持這種視圖能力。
Incremental View
增量視圖:該視圖提供增量查詢的能力,可以查詢指定COMMIT之後的增量數據,可用於快速拉取增量數據。
cow表支持該種視圖能力, mor表也可以支持該視圖,但是一旦mor表完成compact操作其增量視圖能力消失。
Read Optimized View
讀優化視圖:該視圖只會提供最新版本的parquet文件中存儲的數據。
該視圖在cow表和mor表上表現不同:
- 對於cow表,該視圖能力和實時視圖能力是一樣的(cow表只用parquet文件存數據)。
- 對於mor表,僅訪問基本文件,提供給定文件片自上次執行compact操作以來的數據, 可簡單理解為該視圖只會提供mor表parquet文件存儲的數據,log文件裡面的數據將被忽略。 該視圖數據並不一定是最新的,但是mor表一旦完成compact操作,增量log數據被合入到了base數據裡面,這個時候該視圖和實時視圖能力一樣。
如何使用Hudi
目前Hudi集成在Spark2x中,使用Hudi需要安裝Spark2x組件,並安裝Spark2x的客戶端。
- MRS集群的創建可參考MRS快速入門中的“創建集群”章節,例如購買MRS 3.1.0版本集群。
- 安裝Spark2x客戶端,可參考MRS用戶指南中的“安裝客戶端”章節,例如客戶端安裝目錄為:“/opt/client”。
- 安全模式(開啟Kerberos認證)集群,在使用Hudi時,需要創建一個具有訪問Hudi許可權的用戶,可參考MRS用戶指南中的“創建用戶”章節,用戶組選擇hadoop、hive和supergroup,主組選擇hadoop,角色選擇System_administrator,例如創建人機用戶“testuser”。
1.使用root用戶登錄集群客戶端節點,執行如下命令:
cd /opt/client source bigdata_env source Hudi/component_env kinit testuser
2.執行以下命令進入Spark SQL命令行。
spark-sql --master yarn
3.準備Hive數據表。
drop table if exists hivetb_text; create table hivetb_text (id int, comb long, name string, dt date) row format delimited fields terminated by ',' stored as textfile; insert into hivetb_text values (3,301,'0003','2021-09-11'),(4,400,'0004','2021-09-11');
4.創建Hudi Cow分區表。
drop table if exists hudi_test1; create table hudi_test1 (id int, comb long, name string, dt date) using hudi partitioned by (dt) options(type='cow',primaryKey='id', preCombineField='comb');
5.執行insert,插入數據,並查詢結果。
insert into hudi_test1 values (1,100,'aaa','2021-08-28'),(2,200,'bbb','2021-08-28'); insert into hudi_test1 select 3,300,'ccc','2021-09-11'; select id,comb,dt,name from hudi_test1;
6.執行update,更新數據,並查詢結果。
update hudi_test1 set name='0001' where id = 1; select id,comb,dt,name from hudi_test1;
7.執行delete,刪除數據,並查詢結果。
delete from hudi_test1 where id = 2; select id,comb,dt,name from hudi_test1;
8.執行merge,寫入增量數據,並查詢結果。
merge into hudi_test1 t1 using hivetb_text t2 on t1.id = t2.id when matched then update set id=t2.id, comb=t2.comb, name='aaaa', dt=t2.dt when not matched then insert *; select id,comb,dt,name from hudi_test1;
好了,本期雲小課就介紹到這裡,快去體驗MapReduce(MRS)更多功能吧!猛戳這裡