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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...