Apache Hudi(簡稱Hudi)是基於OSSObject Storage Service的一種表格式,支援UPDATE、DELETE和INSERT操作。AnalyticDB for MySQL和Hudi做了深度整合,您可以通過Spark SQL讀寫Hudi外表。本文主要介紹如何通過Spark SQL讀寫Hudi外表。
前提條件
叢集的產品系列為湖倉版。
說明湖倉版叢集儲存預留資源需大於0 ACU。
已在湖倉版叢集中建立Job型資源群組。具體操作,請參見建立資源群組。
已建立湖倉版叢集的資料庫帳號。
步驟一:進入資料開發
登入雲原生資料倉儲AnalyticDB MySQL控制台,在左上方選擇叢集所在地區。在左側導覽列,單擊集群清單,在湖倉版頁簽下,單擊目的地組群ID。
在左側導覽列,單擊
。在SQLConsole視窗,選擇Spark引擎和Job型資源群組。
步驟二:建立外庫與Hudi外表
您可以選擇批處理或互動式執行任意一種方式執行以下SQL語句。詳情請參見Spark SQL執行方式。
執行以下語句,建立資料庫。如果已有資料庫,可跳過本步驟。
CREATE DATABASE adb_external_db_hudi location 'oss://<bucket_name>/test/'; /*用於在該路徑中建立表,請替換為自己的OSS路徑。*/
執行以下語句,建立Hudi外表。
CREATE TABLE adb_external_db_hudi.test_hudi_tbl ( `id` int, `name` string, `age` int ) using hudi tblproperties (primaryKey = 'id', preCombineField = 'age') partitioned by (age) location 'oss://<bucket_name>/test/table/'; /*寫入的資料會儲存在該路徑中,請替換為自己的OSS路徑。*/
重要OSS路徑中的Bucket需與建立資料庫所選的Bucket相同。
建立外表時選擇的OSS路徑需比建立資料庫時選擇的OSS路徑至少多一層目錄,且外表的路徑需在資料庫路徑下。
建表時必須定義primaryKey主鍵。preCombineField預彙總欄位為可選,如未定義preCombineField,則在UPDATE情境會報錯。
步驟三:寫入Hudi外表資料
您可以選擇批處理或互動式執行任意一種方式執行以下SQL語句。詳情請參見Spark SQL執行方式。
INSERT
執行以下語句,寫入資料。您可以選擇以下任意一種方式向Hudi外表中寫入資料。
方式一:INSERT INTO寫入
INSERT INTO adb_external_db_hudi.test_hudi_tbl values(1, 'lisa', 10),(2, 'jams', 10);
方式二:INSERT OVERWRITE全表寫入
INSERT OVERWRITE adb_external_db_hudi.test_hudi_tbl values (1, 'lisa', 10), (2, 'jams', 20);
方式三:INSERT OVERWRITE靜態分區寫入
INSERT OVERWRITE adb_external_db_hudi.test_hudi_tbl partition(age=10) values(1, 'anna');
方式四:INSERT OVERWRITE動態分區寫入
INSERT OVERWRITE adb_external_db_hudi.test_hudi_tbl partition (age) values (1, 'bom', 10);
UPDATE
執行以下語句更新資料,本文以將id=2的name列更新為box為例。
UPDATE adb_external_db_hudi.test_hudi_tbl SET name = 'box' where id = 2;
DELETE
執行以下語句刪除資料,本文以刪除id列為1的資料為例。
DELETE FROM adb_external_db_hudi.test_hudi_tbl where id = 1;
並發控制
Hudi外表基於LockProvider的並發控制機制,避免執行DML操作時出現並發衝突。多個任務可以同時寫入不同的資料範圍,為了避免寫入衝突,需要確保沒有重疊的資料範圍寫入,從而保證了資料的正確性和一致性。您需要配置以下參數來啟用並發控制。詳細Hudi的並發控制機制請參見Apache Hudi。
若使用開源Hudi JAR包,暫不支援MdsBasedLockProvider實現並發控制。
set hoodie.cleaner.policy.failed.writes=LAZY;
set hoodie.write.concurrency.mode=OPTIMISTIC_CONCURRENCY_CONTROL;
set hoodie.write.lock.provider=org.apache.hudi.sync.adb.MdsBasedLockProvider;
參數說明:
參數 | 參數值 | 是否必填 | 描述 | |
hoodie.cleaner.policy.failed.writes | LAZY | 是 | 指定寫入失敗時的髒資料清理策略。 取值為LAZY,表示寫入提交前不清理未完成的提交,失敗的提交待心跳到期後由Clean操作統一清理,適用多個並發寫入的情境。 | |
hoodie.write.concurrency.mode | OPTIMISTIC_CONCURRENCY_CONTROL | 是 | 寫入操作的併發模式。取值為 OPTIMISTIC_CONCURRENCY_CONTROL,表示一個Hudi外表如果同時有多個寫入任務,每個寫入任務提交前都會檢查是否存在提交衝突,衝突情況下本次寫入失敗。 | |
hoodie.write.lock.provider | org.apache.hudi.sync.adb.MdsBasedLockProvider | 是 | 鎖提供者類名,使用者可以提供自己的LockProvider實現,提供的類必須是 |
步驟四:查詢資料
您可以選擇批處理或互動式執行任意一種方式執行以下SQL語句。詳情請參見Spark SQL執行方式。
執行Spark SQL語句,只返回執行成功或者失敗,不返回資料。您可以在Spark Jar開發頁面應用列表頁簽中的日誌查看錶資料。詳情請參見查看Spark應用資訊。
執行以下語句,查詢Hudi外表資料。
SELECT * FROM adb_external_db_hudi.test_hudi_tbl;