Iceberg在袋鼠雲的探索及實踐

来源:https://www.cnblogs.com/DTinsight/archive/2022/12/20/16994996.html
-Advertisement-
Play Games

“數據湖”、“湖倉一體”及“流批一體”等概念,是近年來大數據領域熱度最高的辭彙,在各大互聯網公司掀起了一波波的熱潮,各家公司紛紛推出了自己的技術方案,其中作為全鏈路數字化技術與服務提供商的袋鼠雲,在探索數據湖架構的早期,就調研並選用了Iceberg作為基礎框架,在落地過程中深度使用了Iceberg並 ...


“數據湖”、“湖倉一體”及“流批一體”等概念,是近年來大數據領域熱度最高的辭彙,在各大互聯網公司掀起了一波波的熱潮,各家公司紛紛推出了自己的技術方案,其中作為全鏈路數字化技術與服務提供商的袋鼠雲,在探索數據湖架構的早期,就調研並選用了Iceberg作為基礎框架,在落地過程中深度使用了Iceberg併進行了部分改造,在這個過程中,我們積累出了一些經驗和探索實踐,希望通過本篇文章與大家分享,也歡迎大家一起共同討論。

一、為什麼選擇Iceberg

Iceberg作為Apache基金會下的一個頂級項目,是業界公認的開源數據湖實現方案之一,考慮到任何概念的提出本質上是源於底層軟硬體技術或架構上取得了新的突破,我們首先站在技術演進的角度對Iceberg的出現契機和應用場景進行分析。

01 大數據存儲技術現狀

2006年Hadoop框架橫空出世,改變了企業對數據的存儲、處理和分析的認知,加速了大數據的發展,形成了完善的生態圈。工程師們將龐雜的歷史數據存在分散式文件系統HDFS中,通過Hive、Spark等進行加速計算處理。至今為止,HDFS已然成為廣泛應用的大數據基礎組件。

在這個大數據技術發展過程中,也面臨著一些問題。在Hive中,將表綁定為HDFS上的一個目錄,通過HiveMetaStore記錄其綁定的存儲位置,計算引擎查詢數據時請求主節點獲取文件並讀取,這天然缺少事務保證:某個用戶寫入的文件其他用戶立即可見,沒有隔離性;即便先寫入到隱藏文件中,待事務提交後再全部改名可見,因為一批文件的改名不是原子操作,這隻能保證分區級別的原子性。隨著對象存儲的廣泛應用,通過主節點去獲取全部文件有比較大的性能損耗,因為對象存儲的“List”性能較差。

經過以上分析,我們發現Hive中這種設計的缺陷在於缺乏對錶數據文件的管理維護:對於表中不同時刻包含的數據文件,都要即時訪問HDFS主節點獲取,這樣子就造成了比較大的資源浪費。

而數據湖卻能很好的解決這一問題,數據湖是一個集中各種形式和來源數據的存儲區域,存儲內容雖然種類繁多卻管理有序,對數據文件的組織維護能夠高效地幫助我們對接各類底層存儲和上層計算。

02 數據湖技術選型——Iceberg

我們知道問題的關鍵在於“對錶數據文件的管理維護”,基於此就可以開展技術選型了。在2020年末,技術團隊做了眾多技術方案的調研,包括包括Delta LakeHudiIceberg,我們最終選用了Iceberg。

而選擇Iceberg的原因,正是基於袋鼠雲的技術棧的具體情況做了充足考慮:袋鼠雲中的離線計算、實時計算、智能標簽等應用,在計算層需要依托Spark、Flink、Trino等多種引擎為客戶解決不同的業務訴求,在底層則可能需要對接客戶自建雲、公有雲等混合存儲。這就要求所選擇的技術方案必須能滿足對接多種類型的需求。

Iceberg具備介面開放、易於拓展的優點,十分符合我們的選型要求。在存儲層HDFS上增加一個中間層Iceberg以跟蹤數據文件,不必改變其他層的架構設計,就可以享受到Iceberg對數據文件管理帶來的極速體驗與美妙特性。下圖展示了袋鼠雲基於Iceberg框架的數據湖架構設計:

file

基於前述關鍵點,我們介紹下Iceberg的設計,參考下圖所示:

file

Iceberg在數據文件的基礎上增加了文件清單和文件快照等索引,通過這些索引我們就能跟蹤到每張表在當前時刻有哪些數據文件,這就解決了前文提到的Hive中的設計缺陷:某個用戶寫入的臨時文件不會被其他用戶讀取到,因為這些文件沒有被快照記錄;每個事務修改跟蹤的數據文件時,需要向鎖服務進行申請,成功獲取到鎖許可之後可以更新快照內容,一次快照修改可以增加多個文件,這樣就保證原子性;預先記錄好目錄下的每個數據文件可以避免對HDFS主節點的多次訪問,對雲存儲友好。

二、Iceberg在袋鼠雲中的應用實踐

01 行級更新

在Hive中想要對歷史數據進行訂正,需要用增量數據合併歷史數據後替換歷史數據,這種方式的代價是比較大的,即便是很少的更新也需要對全表或者整個分區進行掃描。

利用Iceberg這種合併和覆寫可以被推遲,如下圖所示:

file

在Iceberg中,可以寫入一份標記刪除的數據文件並再寫入更新後的數據文件,這樣的好處是訂正歷史數據時用戶在數棧平臺的操作等待時間會很短,在查詢的時候再對這個標記刪除文件中的數據進行更新,準確查找到更新之後的數據。而實際對數據文件內容合併的耗時操作推遲在用戶休息的時候,保證了後續操作的性能。

02 查詢加速

在HDFS上,數據文件通常採用Parquet、ORC等存儲格式,這些存儲格式中記錄了諸如列最大值/最小值/空值等詳細的元數據信息,因此在進行查詢的過程中,Iceberg充分利用了存儲格式提供的元數據信息進行文件過濾。

用戶在數棧平臺寫入數據時,在文件清單中彙總了每個文件中保存數據每一列的最大值/最小值/空值信息。在查詢數據時,對查詢條件和彙總信息進行交集判斷,對於沒有交集的文件就不需要再去讀取了,這樣就能夠極大的減少需要讀取的文件數量。

考慮到數據文件的分佈是在寫入時決定的,在寫入數據順序不規律的情況下,文件中的最大值/最小值範圍跨度會很大,這樣並集判斷過濾的效果就沒有那麼明顯了,這時候在數棧平臺上按照一定規則對數據進行重排列,使得具有相似特征的數據落入到同一個數據文件里,這樣提取出來的最大值/最小值信息就會在更接近的範圍里,查詢過濾性能會有更大提升。

03 自動治理

在Iceberg的寫入過程中,為了支持快速寫入和數據跟蹤等功能,其代價是會在每次操作引入不同數量的小文件,這些小文件會隨著時間的前進而不斷拖延系統的效率,必須要通過合併操作進行刪除才能繼續保證系統的高效。

Iceberg本身提供了文件合併、快照清理等工具,但這需要用戶手動去啟動任務才能觸發,對於使用者來說是額外心智負擔。

file

如上圖所示,袋鼠雲在產品設計上為用戶屏蔽了這種運維上的複雜度,用戶只需要對錶進行基本參數的設置就可以享受新框架優化後帶來的快速和便捷,而更複雜的文件治理任務的啟動和資源配置都交由後臺程式監控完成。

三、袋鼠雲基於Iceberg的改造

除了對Iceberg本身提供的能力進行應用,袋鼠雲還根據生產場景的要求對Iceberg做了一定的改造。

01 列更新

在袋鼠雲標簽引擎中經常有需要根據原子指標生成派生指標的場景,在後臺程式中就是為一張大寬表增加新的欄位並且填入數據。在過去,我們依賴OverWrite操作在HDFS上重寫新的表數據,然而這種操作都需要將全部欄位數據進行寫入,非常消耗存儲和時間的(想象一下一張表有幾百個欄位,每次都需要重新寫入)。

file

基於Iceberg袋鼠雲設計了一種優化方案,如上圖所示:保留原來的數據文件,列更新時將新的欄位數據和表的主鍵欄位數據一起寫入到新的數據文件。這樣,在寫入過程中需要寫入的數據量就大大減少了,而在讀取過程中,再將新欄位和原有的欄位做一次合併,這樣就能夠保證數據的準確性。同時我們還會在查詢時只讀取包含查詢欄位的文件以提高查詢性能。

當然,在多次添加新欄位之後,每次查詢中包含的合併操作就多了,性能就會隨之下降,這就需要結合前述的文件合併功能,定時進行數據合併,這樣更新累計的副作用就可以消除了。

02 批流一體

批流一體在存儲上要解決的很重要的問題是:離線數倉依賴HDFS存儲,HDFS能夠提供大規模的存儲,成本低廉,然而其實時性比較差;實時數倉依賴Kafka存儲,Kafka能夠存儲的數據量有限,但是能夠提供非常好的實時性。兩條技術鏈路帶來了理解和使用上的困難,能否提供統一的存儲是批流一體架構落地的關鍵。

在袋鼠雲中,我們提出了一種基於Iceberg的屏蔽能力,構建的針對這兩種組件的統一存儲方案:底層存儲混合使用Iceberg和Kafka,但對使用者只暴露一張完整的數據表,在Iceberg中記錄Kafka的切換位點(偏移量),讀取時根據當前數據的時間信息選擇讀取Kafka或者Iceberg數據源。如下圖所示:

file

具體步驟有:

1)在創建表時,設置Iceberg存儲和Kafka存儲相關的元數據信息。

2)寫入數據時,向兩種存儲介質一起寫入。在Iceberg每次生成新快照時,將最後一條數據對應的Kafka偏移量寫入快照信息里。用戶可以選擇性開始Kafka事務保證。

3)讀取數據時,在最近一段時間內的數據都通過Kafka進行消費,在讀取完Kafka的數據後根據偏移量切換到對Iceberg記錄的HDFS文件進行訪問,讀取歷史數據。

這樣就能符合了袋鼠雲用戶使用不同處理速度去處理不同階段數據的需求。

四、寫在最後

以上就是袋鼠雲基於Iceberg在數據湖的一些探索和實踐,目前這種框架已應用於我們的數據湖產品DataLake——提供面向湖倉一體的數據湖管理分析服務。基於統一的元數據抽象構建一致性的數據訪問,提供海量數據的存儲管理和實時分析處理能力,可以幫助企業快速構建湖倉一體化平臺,完成數字化基礎建設。

file

未來我們還會對數據湖和湖倉一體架構做更多的探索和應用,敬請期待。

歡迎大家瞭解或咨詢更多有關數據湖產品的信息
想瞭解或咨詢更多有關袋鼠雲大數據產品、行業解決方案、客戶案例的朋友,瀏覽袋鼠雲官網:https://www.dtstack.com/?src=szbky

同時,歡迎對大數據開源項目有興趣的同學加入「袋鼠雲開源框架釘釘技術qun」,交流最新開源技術信息,qun號碼:30537511,項目地址:https://github.com/DTStack


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一. anaconda 簡介 Anaconda是一個開源的Python發行版本,用來管理Python相關的包,安裝Anaconda可以很方便的切換不同的環境,使用不同的深度學習框架開發項目。 二. anaconda 下載地址 anaconda 官網地址: https://www.anaconda.c ...
  • 代碼里我們經常會出現大量的條件判斷,在這種情況下,我們可以實現狀態機避免過度使用 有一種方式是把各種狀態歸為各種狀態類 還有一種方式是修改實例的__class__屬性 1 """ 2 狀態機的實現 3 修改實例的__class__屬性 4 """ 5 6 7 class Connection: 8 ...
  • JZ47 禮物的最大價值 描述 描述 在一個m\times nm×n的棋盤的每一格都放有一個禮物,每個禮物都有一定的價值(價值大於 0)。你可以從棋盤的左上角開始拿格子里的禮物,並每次向右或者向下移動一格、直到到達棋盤的右下角。給定一個棋盤及其上面的禮物的價值,請計算你最多能拿到多少價值的禮物? 如 ...
  • 面向對象 1.面向對象簡介 類(Class): 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。 方法:類中定義的函數。 類變數:類變數在整個實例化的對象中是公用的。類變數定義在類中且在函數體之外。類變數通常不作為實例變數使用。 數據成員:類變數 ...
  • 一:背景 1.講故事 今天是🐏的第四天,頭終於不巨疼了,寫文章已經沒什麼問題,趕緊爬起來寫。 這個月初有位朋友找到我,說他的程式出現了CPU爆高,讓我幫忙看下怎麼回事,簡單分析了下有兩點比較有意思。 這是一個安全生產的信息管理平臺,第一次聽說,我的格局小了。 這是一個經典的 CPU 爆高問題,過往 ...
  • 一 引入 在設計設備界面時,經常會有一種需求,展示一個閥門,閥門有通斷兩種狀態: 二 CommonValveControl 考慮實現一個自定義控制項,CommonValveControl。 使用自定義控制項比用戶控制項更靈活,更具擴展性,可以使用不同的樣式和模板。 CommonValveControl定義 ...
  • 說明 基於微服務項目,產生的的多項目倉庫管理腳本。可直接保存 shell 腳本後酌情修改後試用 目錄結構 xxxx Xxx1Api/ Xxx2Api/ git_clone_api.sh git_branch_dev.sh git_pull_all.sh git_status.sh api-build ...
  • 1. 查看當做操作目錄位置 > pwd2. 查看(當前)目錄裡邊的文件內容 > ls //list > ls -l 或ll //顯示文件的詳細信息 > ls -al //all顯示文件的詳細信息(包括隱藏文件) > ls -a //顯示目錄全部文件名字(包括隱藏文件) > ls [-al] 目錄 / ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...