Iceberg 實戰(zhàn) | Flink + Iceberg,百億級實時數據入湖實戰(zhàn)
騰訊數據湖介紹
百億級數據場景落地
未來規(guī)劃
總結
GitHub 地址 
一、騰訊數據湖介紹
二、百億級數據落地場景落地
1. 傳統(tǒng)平臺架構

Lambda 架構中,批和流是分開的,所以運維要有兩套集群,一套是 For Spark/Hive,一套是 For Flink。這存在幾個問題:
第一是運維的成本比較大; 第二是開發(fā)成本。例如在業(yè)務方面,一會要寫 Spark,一會要寫 Flink 或者 SQL,總體來說,開發(fā)成本對數據分析人員不是特別友好。 第二個是 Kappa 架構。其實就是消息隊列,到底層的傳輸,再到后面去做一些分析。它的特點是比較快,基于 Kafka 有一定的實時性。
2. 場景一: 手 Q 安全數據入湖

■ 小文件挑戰(zhàn)
3、小文件爆炸
■ 解決方案
增加小文件合并 Operators;
增加 Snapshot 自動清理機制。
增加后臺服務進行小文件合并和孤兒文件刪除;
增加小文件過濾邏輯,逐步刪除小文件;
增加按分區(qū)合并邏輯,避免一次生成太多刪除文件導致任務 OOM。

■ Fanout Writer 的坑

在 Fanout Writer 時,如果數據量大可能會遇到多層分區(qū)。比如手 Q 的數據分省、分市;但分完之后還是很大,于是又分 bucket。此時每個 Task Manager 里可能分到很多分區(qū),每個分區(qū)打開一個 Writer,Writer 就會非常的多,造成內存不足。
這里我們做了兩件事情:
第一是 KeyBy 支持。根據用戶設置的分區(qū)做 KeyBy 的動作,然后把相同分區(qū)的聚集在一個 Task Manager 中,這樣它就不會打開那么多分區(qū)的 Writer。當然,這樣的做法會帶來一些性能上的損失。
第二是做 LRU Writer,在內存里面維持一個 Map。
3. 場景二:新聞平臺索引分析

上方是基于 Iceberg 流批一體的新聞文章在線索引架構。左邊是 Spark 采集 HDFS 上面的維表,右邊是接入系統(tǒng),采集以后會用 Flink 和維表做一個基于 Window 的 Join,然后寫到索引流水表中。
■ 功能
準實時明細層;
實時流式消費;
流式 MERGE INTO;
多維分析;
離線分析。
■ 場景特點
上述場景有以下幾個特點:
數量級:索引單表超千億,單 batch 2000 萬,日均千億;
時延需求:端到端數據可見性分鐘級;
數據源:全量、準實時增量、消息流;
消費方式:流式消費、批加載、點查、行更新、多維分析。
■ 挑戰(zhàn):MERGE INTO
有用戶提出了 Merge Into 的需求,因此我們從三個方面進行了思考:
功能:將每個 batch join 后的流水表 Merge into 到實時索引表,供下游使用;
性能:下游對索引時效性要求高,需要考慮 merge into 能追上上游的 batch 消費窗口;
易用性:Table API?還是 Action API?又或是 SQL API?
■ 解決方案
第一步
參考 Delta Lake 設計 JoinRowProcessor;
利用 Iceberg 的 WAP 機制寫臨時快照。
第二步
可選擇跳過 Cardinality-check;
寫入時可以選擇只 hash,不排序。
第三步
支持 DataframeAPI;
Spark 2.4 支持 SQL;
Spark 3.0 使用社區(qū)版本。
4. 場景三:廣告數據分析
■ 廣告數據主要有以下幾個特點:
數量級:日均千億 PB 數據,單條 2K;
數據源:SparkStreaming 增量入湖;
數據特點:標簽不停增加,schema 不停變換;
使用方式:交互式查詢分析。
■ 遇到的挑戰(zhàn)與對應的解決方案:
挑戰(zhàn)一:Schema 嵌套復雜,平鋪后近萬列,一寫就 OOM。
解決方案:默認每個 Parquet Page Size 設置為 1M,需要根據 Executor 內存進行 Page Size 設置。
挑戰(zhàn)二:30 天數據基本集群撐爆。
解決方案:提供 Action 進行生命周期管理,文檔區(qū)分生命周期和數據生命周期。
挑戰(zhàn)三:交互式查詢。
解決方案:
三、未來規(guī)劃
對于未來的規(guī)劃主要分為內核側與平臺側。
1. 內核側
在未來,我們希望在內核側有以下幾點規(guī)劃:
■ 更多的數據接入
增量入湖支持;
V2 Format 支持;
Row Identity 支持。
索引支持;
Alloxio 加速層支持;
MOR 優(yōu)化。
數據治理 Action;
SQL Extension 支持;
更好的元數據管理。
2、平臺側
在平臺側我們有以下幾點規(guī)劃:
元數據清理服務化;
數據治理服務化。
Spark 消費 CDC 入湖;
Flink 消費 CDC 入湖。
寫入數據指標;
小文件監(jiān)控和告警。
四、總結
可用性:通過多個業(yè)務線的實戰(zhàn),確認 Iceberg 經得起日均百億,甚至千億的考驗。
易用性:使用門檻比較高,需要做更多的工作才能讓用戶使用起來。
場景支持:目前支持的入湖場景 還沒有 Hudi 多,增量讀取這塊也比較缺失,需要大家努力補齊。
另外~《Apache Flink-實時計算正當時》電子書重磅發(fā)布,本書將助您輕松 Get Apache Flink 1.13 版本最新特征,同時還包含知名廠商多場景 Flink 實戰(zhàn)經驗,學用一體,干貨多多!快掃描下方二維碼獲取吧~
(本次為搶鮮版,正式版將于 7 月初上線)

更多 Flink 相關技術交流,可掃碼加入社區(qū)釘釘大群~
▼ 關注「Flink 中文社區(qū)」,獲取更多技術干貨 ▼
戳我,立即報名!
