Iceberg在袋鼠雲的探索及實踐
”、 及 “ 等概念,是近年來大資料領域熱度最高的詞彙,在各大網際網路公司掀起了一波波的熱潮,各家公司紛紛推出了自己的技術方案,其中作為全鏈路數字化技術與服務提供商的袋鼠雲,在探索資料湖架構的早期,就調研並選用了 Iceberg 作為基礎框架,在落地過程中深度使用了 Iceberg 並進行了部分改造,在這個過程中,我們積累出了一些經驗和探索實踐,希望透過本篇文章與大家分享,也歡迎大家一起共同討論。
一、為什麼選擇 Iceberg
Iceberg 作為 下的一個頂級專案,是業界公認的 之一,考慮到任何概念的提出本質上是源於底層軟硬體技術或架構上取得了新的突破,我們首先站在技術演進的角度對 Iceberg 的出現契機和應用場景進行分析。
01
2006 年 Hadoop 框架橫空出世,改變了企業對資料的儲存、處理和分析的認知,加速了大資料的發展,形成了完善的生態圈。工程師們將龐雜的歷史資料存在分散式檔案系統 HDFS 中,透過 Hive、Spark 等進行加速計算處理。至今為止,HDFS 已然成為廣泛應用的大資料基礎元件。
在這個大資料技術發展過程中,也面臨著一些問題。在 中,將表繫結為 HDFS 上的一個目錄,透過 HiveMetaStore 記錄其繫結的儲存位置,計算引擎查詢資料時請求主節點獲取檔案並讀取,這天然缺少事務保證:某個使用者寫入的檔案其他使用者立即可見,沒有隔離性;即便先寫入到隱藏檔案中,待事務提交後再全部改名可見,因為一批檔案的改名不是原子操作,這隻能保證分割槽級別的原子性。隨著物件儲存的廣泛應用,透過主節點去獲取全部檔案有比較大的效能損耗,因為 的 “List” 效能較差。
經過以上分析,我們發現 Hive 中這種設計的缺陷在於缺乏 :對於表中不同時刻包含的資料檔案,都要即時訪問 HDFS 主節點獲取,這樣子就造成了比較大的資源浪費。
而資料湖卻能很好的解決這一問題,資料湖是一個集中各種形式和來源資料的 ,儲存內容雖然種類繁多卻管理有序,對資料檔案的組織維護能夠高效地幫助我們對接各類底層儲存和上層計算。
02 資料湖技術選型 ——Iceberg
我們知道問題的關鍵在於 ,基於此就可以開展技術選型了。在 2020 年末,技術團隊做了眾多技術方案的調研,包括包括 、 、 ,我們最終選用了 Iceberg。
而選擇 Iceberg 的原因,正是基於袋鼠雲的技術棧的具體情況做了充足考慮:袋鼠雲中的離線計算、實時計算、智慧標籤等應用,在計算層需要依託 Spark、Flink、Trino 等多種引擎為客戶解決不同的業務訴求,在底層則可能需要對接客戶自建雲、公有云等混合儲存。這就要求所選擇的技術方案必須能滿足對接多種型別的需求。
Iceberg 具備介面開放、易於擴充的優點,十分符合我們的選型要求。在儲存層 HDFS 上增加一箇中間層 Iceberg 以跟蹤資料檔案,不必改變其他層的架構設計,就可以享受到 Iceberg 對資料檔案管理帶來的極速體驗與美妙特性。下圖展示了袋鼠雲基於 Iceberg 框架的資料湖架構設計:
基於前述關鍵點,我們介紹下 的設計,參考下圖所示:
Iceberg 在資料檔案的基礎上增加了檔案清單和檔案快照等索引,透過這些索引我們就能跟蹤到每張表在當前時刻有哪些資料檔案,這就解決了前文提到的 Hive 中的設計缺陷:某個使用者寫入的臨時檔案不會被其他使用者讀取到,因為這些檔案沒有被快照記錄;每個事務修改跟蹤的資料檔案時,需要向鎖服務進行申請,成功獲取到鎖許可之後可以更新快照內容,一次快照修改可以增加多個檔案,這樣就保證原子性;預先記錄好目錄下的每個資料檔案可以避免對 HDFS 主節點的多次訪問,對雲端儲存友好。
二、Iceberg 在袋鼠雲中的應用實踐
01 行級更新
在 Hive 中想要對歷史資料進行訂正,需要用增量資料合併歷史資料後替換歷史資料,這種方式的代價是比較大的,即便是很少的更新也需要對全表或者整個分割槽進行掃描。
利用 Iceberg 這種合併和覆寫可以被推遲,如下圖所示:
在 Iceberg 中,可以寫入一份標記刪除的資料檔案並再寫入更新後的資料檔案,這樣的好處是訂正歷史資料時使用者在數棧平臺的操作等待時間會很短,在查詢的時候再對這個標記刪除檔案中的資料進行更新,準確查詢到更新之後的資料。而實際對資料檔案內容合併的耗時操作推遲在使用者休息的時候,保證了後續操作的效能。
02 查詢加速
在 HDFS 上,資料檔案通常採用 等儲存格式,這些儲存格式中記錄了諸如列最大值 / 最小值 / 空值等詳細的後設資料資訊,因此在進行查詢的過程中,Iceberg 充分利用了儲存格式提供的後設資料資訊進行檔案過濾。
使用者在數棧平臺寫入資料時,在檔案清單中彙總了每個檔案中儲存資料每一列的最大值 / 最小值 / 空值資訊。在查詢資料時,對查詢條件和彙總資訊進行交集判斷,對於沒有交集的檔案就不需要再去讀取了,這樣就能夠極大的減少需要讀取的檔案數量。
考慮到資料檔案的分佈是在寫入時決定的,在寫入資料順序不規律的情況下,檔案中的最大值 / 最小值範圍跨度會很大,這樣並集判斷過濾的效果就沒有那麼明顯了,這時候在數棧平臺上按照一定規則對資料進行重排列,使得具有相似特徵的資料落入到同一個資料檔案裡,這樣提取出來的最大值 / 最小值資訊就會在更接近的範圍裡,查詢過濾效能會有更大提升。
03 自動治理
在 Iceberg 的寫入過程中,為了支援快速寫入和 等功能,其代價是會在每次操作引入不同數量的小檔案,這些小檔案會隨著時間的前進而不斷拖延系統的效率,必須要透過合併操作進行刪除才能繼續保證系統的高效。
Iceberg 本身提供了檔案合併、快照清理等工具,但這需要使用者手動去啟動任務才能觸發,對於使用者來說是額外心智負擔。
如上圖所示,袋鼠雲在產品設計上為使用者遮蔽了這種運維上的複雜度,使用者只需要對錶進行基本引數的設定就可以享受新框架最佳化後帶來的快速和便捷,而更復雜的檔案治理任務的啟動和資源配置都交由後臺程式監控完成。
三、袋鼠雲基於 Iceberg 的改造
除了對 Iceberg 本身提供的能力進行應用,袋鼠雲還根據生產場景的要求對 Iceberg 做了一定的改造。
01 列更新
在袋鼠雲 中經常有需要根據原子指標生成派生指標的場景,在後臺程式中就是為一張大寬表增加新的欄位並且填入資料。在過去,我們依賴 OverWrite 操作在 HDFS 上重寫新的表資料,然而這種操作都需要將全部欄位資料進行寫入,非常消耗儲存和時間的(想象一下一張表有幾百個欄位,每次都需要重新寫入)。
基於 Iceberg 袋鼠雲設計了一種最佳化方案,如上圖所示:保留原來的資料檔案,列更新時將新的欄位資料和表的主鍵欄位資料一起寫入到新的資料檔案。這樣,在寫入過程中需要寫入的資料量就大大減少了,而在讀取過程中,再將新欄位和原有的欄位做一次合併,這樣就能夠保證資料的準確性。同時我們還會在查詢時只讀取包含查詢欄位的檔案以提高查詢效能。
當然,在多次新增新欄位之後,每次查詢中包含的合併操作就多了,效能就會隨之下降,這就需要結合前述的檔案合併功能,定時進行資料合併,這樣更新累計的副作用就可以消除了。
02 批流一體
在儲存上要解決的很重要的問題是:離線數倉依賴 HDFS 儲存,HDFS 能夠提供大規模的儲存,成本低廉,然而其實時性比較差;實時數倉依賴 Kafka 儲存,Kafka 能夠儲存的資料量有限,但是能夠提供非常好的實時性。兩條技術鏈路帶來了理解和使用上的困難,能否提供統一的儲存是批流一體架構落地的關鍵。
在袋鼠雲中,我們提出了一種基於 Iceberg 的遮蔽能力,構建的針對這兩種元件的統一儲存方案:底層儲存混合使用 Iceberg 和 Kafka,但對使用者只暴露一張完整的資料表,在 Iceberg 中記錄 Kafka 的切換位點(偏移量),讀取時根據當前資料的時間資訊選擇讀取 Kafka 或者 Iceberg 資料來源。如下圖所示:
具體步驟有:
1)在建立表時,設定 Iceberg 儲存和 Kafka 儲存相關的後設資料資訊。
2)寫入資料時,向兩種儲存介質一起寫入。在 Iceberg 每次生成新快照時,將最後一條資料對應的 Kafka 偏移量寫入快照資訊裡。使用者可以選擇性開始 Kafka 事務保證。
3)讀取資料時,在最近一段時間內的資料都透過 Kafka 進行消費,在讀取完 Kafka 的資料後根據偏移量切換到對 Iceberg 記錄的 HDFS 檔案進行訪問,讀取歷史資料。
這樣就能符合了袋鼠雲使用者使用不同處理速度去處理不同階段資料的需求。
四、寫在最後
以上就是袋鼠雲基於 Iceberg 在 的一些探索和實踐,目前這種框架已應用於我們的 —— 提供面向湖倉一體的資料湖管理分析服務。基於統一的後設資料抽象構建一致性的資料訪問,提供海量資料的儲存管理和實時分析處理能力,可以幫助企業快速構建湖倉一體化平臺,完成數字化基礎建設。
未來我們還會對資料湖和 做更多的探索和應用,敬請期待。
歡迎大家瞭解或諮詢更多有關 的資訊 想了解或諮詢更多有關袋鼠雲大資料產品、行業解決方案、客戶案例的朋友,瀏覽袋鼠雲官網: https:///?src=szitpub
同時,歡迎對大資料開源專案有興趣的同學加入「袋鼠雲開源框架釘釘技術 qun」,交流最新開源技術資訊,qun 號碼:30537511,專案地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69995740/viewspace-2928792/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 實戰乾貨|Spark 在袋鼠雲數棧的深度探索與實踐Spark
- 探索大模型:袋鼠雲在 Text To SQL 上的實踐與最佳化大模型SQL
- 為資料安全護航,袋鼠雲在資料分類分級上的探索實踐
- Iceberg 資料治理及查詢加速實踐
- 乾貨分享|袋鼠雲數棧離線開發平臺在小檔案治理上的探索實踐之路
- 袋鼠雲數棧基於CBO在Spark SQL優化上的探索SparkSQL優化
- Presto在滴滴的探索與實踐REST
- 直播預約丨《實時湖倉實踐五講》第三講:實時湖倉在袋鼠雲的落地實踐之路
- 開源實踐 | 攜程在OceanBase的探索與實踐
- 開源實踐 | 攜程在 OceanBase 的探索與實踐
- 如何最大化客戶生命週期價值?APMDR 模型在袋鼠雲的落地實踐模型
- Node 呼叫 dubbo 服務的探索及實踐
- Apache Paimon 在同程旅行的探索實踐ApacheAI
- 雲原生技術領域的探索與實踐
- 混合雲網路生態的探索與實踐
- vivo雲原生容器探索和落地實踐
- G7在實時計算的探索與實踐
- Flink 在 B 站的多元化探索與實踐
- 美團儲存雲原生探索和實踐
- vivo 在離線混部探索與實踐
- B站基於Iceberg的湖倉一體架構實踐架構
- ChatGPT的探索與實踐ChatGPT
- OceanBase 的探索與實踐
- CDC YAML 在阿里雲的最佳實踐YAML阿里
- 從5分鐘到60秒,袋鼠雲數棧在熱重啟技術上的提效探索之路
- 雲音樂隱性關係鏈的探索與實踐
- 華為多年實踐:ServiceComb在Service Mesh的探索與思考
- Service Mesh 在中國工商銀行的探索與實踐
- Redis 記憶體優化在 vivo 的探索與實踐Redis記憶體優化
- EventBridge 在 SaaS 企業整合領域的探索與實踐
- B 站基於 Iceberg 湖倉一體最佳化實踐及智慧化管理平臺的助力
- RocketMQ Streams在雲安全及 IoT 場景下的大規模最佳實踐MQ
- 袋鼠雲平臺程式碼規範化編譯部署的提效性改進實踐編譯
- 視訊通訊關鍵技術探索及實踐
- RocketMQ 在網易雲音樂的實踐MQ
- Flink CDC 在大健雲倉的實踐
- 袋鼠雲數棧前端從 Multirepo 到 Monorepo 研發效率提升探索之路前端Mono
- 從 Multirepo 到 Monorepo 袋鼠雲數棧前端研發效率提升探索之路Mono前端