一、資料準備
1、mysql地址選擇
因為阿里雲只讀節點binlog保留時間短,需要用讀寫叢集地址。可以登入阿里雲控制檯檢視地址是隻讀還是讀寫,不清楚的話可以找dba要讀寫地址。
二、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型別
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、資料整合建資料來源
6、配置同步任務
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分鐘以上,在洛書平臺設定治理任務。
四、任務運維注意事項
因每次插入資料都會生成一個快照和很多小檔案,為預防快照和小檔案過多影響查詢速度,需要定時清理。請全量同步完成時,配置治理任務開始治理
治理平臺: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;