使用iceberg-使用Iceberg資料湖需要注意的點

黑水滴發表於2024-04-22

一、資料準備

1、mysql地址選擇

因為阿里雲只讀節點binlog保留時間短,需要用讀寫叢集地址。可以登入阿里雲控制檯檢視地址是隻讀還是讀寫,不清楚的話可以找dba要讀寫地址。

使用iceberg-使用Iceberg資料湖需要注意的點

二、Iceberg概念

1、Iceberg選擇合適的表版本

簡述:Iceberg目前有兩個表版本(V1和V2),根據資料選擇合適的表版本。

V1表只支援增量資料插入,適合做純增量寫入場景,如埋點資料。

V2表才支援行級更新,適合做狀態變化的更新,如訂單表同步。

使用方式:建表語句時指定版本'format-version'='2',不指定引數預設使用V1

2、建表型別轉換問題

簡述:mysql表create_time大多為timestamp型別,同步到iceberg後使用spark查詢會報timezone錯誤。

原因:源表沒有timezone, 下游表需要設定local timezone

使用方式:建iceberg表時指定欄位型別為TIMESTAMP_LTZ型別

使用iceberg-使用Iceberg資料湖需要注意的點

3、任務全量同步和增量同步配置

簡述:全量同步階段需要速度快,可以把flink checkpoint設定為1分鐘,併發可以調高(比如1CU*10)這樣可以快速同步資料。同時要考慮你的資料來源能支援多快抽取,評估好抽取併發,否則dba會找你。

增量階段一般資料量比較低了,全量同步完後可以調小資源和併發(比如0.5CU*1)然後重新發布可以節省資源。mysql增量階段只能單執行緒跑,設定併發多也沒用

三、任務開發

1、建表

可以聯絡平臺在spark客戶端建表

(1)Iceberg v2更新表sql(只有v2表才支援更新資料,v1表只能追加資料)
CREATE TABLE data_lake_ods.test3(
    id bigint COMMENT 'unique id',
    `empcode` STRING
)USING iceberg
TBLPROPERTIES(
  'format-version'='2'
  ,'write.upsert.enabled'='true'
  ,'engine.hive.enabled'='true'
  ,'table.drop.base-path.enabled'='true'
);
 
(2)Iceberg v1非更新表sql(不支援資料更新,適合只有insert場景,如埋點資料)
CREATE TABLE data_lake_ods.test3 (
    `id` int ,
    `empcode` STRING
) USING iceberg;
 
(3)修改表format版本或其他屬性
alter table data_lake_ods.test3 SET TBLPROPERTIES('format-version'='2');

2、刪表-騰訊定製(spark客戶端方式刪表)

簡述:和hive刪表不一樣,iceberg預設只刪除後設資料不清理hdfs表目錄,刪表語句後面需要加purge關鍵字可刪除。騰訊特殊改造過包

功能描述:預設drop table 不會清理hdfs資料,使用官方 DROP TABLE spark_catalog.db.sample PURGE時會清理資料,但是還留存【表/data】、【表/metadata】檔案。

修改包:iceberg-spark-runtime-3.2_2.12-1.3.1.jar

社群提交程式碼:https://github.com/apache/iceberg/pull/1839/files

官方ddl文件:https://iceberg.apache.org/docs/1.3.1/spark-ddl/

使用方式:

!!!使用最佳化後的icebrg包

在建表時需要開啟'table.drop.base-path.enabled'='true'

刪表時:DROP TABLE data_lake_ods.test3 PURGE;

3、新增欄位

ALTER TABLE data_lake_ods.table_name ADD COLUMN `event_timestamp` timestamp COMMENT 'kafka更新時間戳';

4、插入和更新資料

insert into table data_lake_ods.test3 values (1,"code1");
update data_lake_ods.test3 set empcode='code2' where id=1;

5、資料整合建資料來源

使用iceberg-使用Iceberg資料湖需要注意的點

6、配置同步任務

使用iceberg-使用Iceberg資料湖需要注意的點

1)資料來源高階引數

--最佳化抽數速度,如非均勻分佈表,設定此引數可以加快分片速度

scan.incremental.snapshot.chunk.size=50000

--最後一個分片切割,適用於同步時間長的大表,在同步後新增資料很多場景
scan.lastchunk.optimize.enable=true

2)任務高階引數

--由於分散式系統中的 shuffle 會造成 ChalgeLog 資料的亂序,所以 sink 接收到的資料可能在全域性的 upsert 中亂序,所以要在 upsert sink 之前新增一個 upsert 物化運算元。該引數控制是否新增

table.exec.sink.upsert-materialize=NONE

7、整庫同步--同步前設定高階引數,整庫同步支援新表自動同步

mysql新增加表後iceberg會自動新加表,mysql刪表後iceberg會暫停這個表的同步,任務不會中止,iceberg表不會刪除

scan.newly-added-table.enabled=true

8、查詢資料

presto引擎: select * from data_lake_ods.test1 limit 200

kyuubi引擎: select * from data_lake_ods.test1 limit 200

9、iceberg表治理

原因:實時程式每個checkpoint寫入都會生成多個檔案,小檔案太多會影響下游查詢速度,逐漸變慢直到不可用。所以需要每天定時治理任務小檔案

http://127.0.0.1:9090/luoshu/

全量資料同步完成後,修改checkpoint為5分鐘以上,在洛書平臺設定治理任務。

使用iceberg-使用Iceberg資料湖需要注意的點

四、任務運維注意事項

因每次插入資料都會生成一個快照和很多小檔案,為預防快照和小檔案過多影響查詢速度,需要定時清理。請全量同步完成時,配置治理任務開始治理

治理平臺:http://127.0.0.1:9090/luoshu/

1、小檔案合併

簡述:全量同步後因為每分鐘一次checkpoint會生成大量的小檔案,全量同步結束後需要做一下小檔案合併,提高查詢速度。

參考資訊:Iceberg小檔案合併測試

2、過期快照清理

全量同步後因為每分鐘一次checkpoint會產生大量快照,全量同步結束後需要做一下快照清理,提高查詢速度。

參考資訊:Iceberg過期快照清理

五、附錄

1、建表最佳化

建表時設定metadata.json保留版本個數

功能描述:每次插入資料都會生成一個metadata檔案,插入次數太多會影響查詢,所以設定保留版本個數

詳細介紹和測試文件:Iceberg後設資料合併-metadata.json檔案

CREATE TABLE data_lake_ods.test3 (
`id` int ,
`empcode` STRING
) USING iceberg
TBLPROPERTIES(
'format-version'='2'
,'write.metadata.delete-after-commit.enabled'='true'
,'write.metadata.previous-versions-max'='3'
);
--插入和更新資料
insert into table iceberg_test.test3 values (1,"code1");
update iceberg_test.test3 set empcode='code2' where id=1;

相關文章