數據湖選型指南|Hudi vs Iceberg 數據更新能力深度對比

来源:https://www.cnblogs.com/DTinsight/archive/2023/03/17/17225954.html
-Advertisement-
Play Games

數據湖作為新一代大數據基礎設施,近年來持續火熱,許多前線的同學都在討論數據湖應該怎麼建,許多企業也都在構建或者計劃構建自己的數據湖。基於此,自然引發了許多關於數據湖選型的討論和探究。但是經過搜索之後我們發現,網上現存的很多內容都是基於較早之前的開源信息做出的結論,在企業調研初期容易造成不准確的印象和 ...


數據湖作為新一代大數據基礎設施,近年來持續火熱,許多前線的同學都在討論數據湖應該怎麼建,許多企業也都在構建或者計劃構建自己的數據湖。基於此,自然引發了許多關於數據湖選型的討論和探究。但是經過搜索之後我們發現,網上現存的很多內容都是基於較早之前的開源信息做出的結論,在企業調研初期容易造成不准確的印象和理解。

因此帶著這樣的問題,我們計劃推出數據湖選型系列文章,基於最新的開源信息,從升級數據湖架構的幾個重要緯度幫助大家進行深度對比。希望能拋磚引玉,引起大家一些思考和共鳴,歡迎同學們一起探討。

實踐過程中我們發現,在計劃升級數據湖架構的客戶中,支持數據的事務更新通常是大家的第一基礎訴求。因此,該系列的第一篇內容我們將從需求的誕生背景,以及不同數據湖架構在數據事務上的能力對比,兩個方面幫助大家在數據湖選型之路上做出更好的決定。

需求背景

在傳統的 Hive 離線數倉架構下,數據更新的成本是非常大的,更新一條數據需要重寫整個分區甚至整張表。因此在真實業務場景中,出於開發成本、數據風險等方面的考慮,大家都不會在 Hive 數倉中更新數據。

不過隨著 Hive 3.0 的推出,Hive 表在事務能力上也向前邁了一大步,官方在推出 3.0 時也重點宣傳了它的事務能力。不過在實際應用中仍然存在非常大的限制,真實投產的用戶寥寥無幾。(僅支持ORC事務內表,這意味著像Spark這類計算引擎,無法直接在Hive事務表上進行ETL/ELT開發,包括像CDH、袋鼠雲公司都在Spark相容上做過投入,但是效果不佳,遠達不到生產級的應用預期)

因此,在數據湖選型過程中,高效的併發更新能力就顯得尤為重要。它能夠改變我們在 Hive 數倉中遇到的數據更新成本高的問題,支持對海量的離線數據做更新刪除。

數據更新實現的選型

目前市面上核心的數據湖開源產品大致有這麼幾個:Apache Iceberg、Apache Hudi和 Delta。

本文將為大家重點介紹 Hudi 和 Iceberg 在數據更新實現方面的表現。

Hudi 的數據更新實現

Hudi(Hadoop Update Delete Incremental),從這個名稱可以看出,它的誕生就是為瞭解決 Hadoop 體系內數據更新和增量查詢的問題。要想弄明白 Hudi 是如何在 HDFS 這類文件系統上實現快速 update 操作的,我們需要先瞭解 Hudi 的幾個特性:

· Hudi 表的文件組織形式:在每個分區(Partition)內,數據文件被切分組織成一個個文件組(FileGroup),每個文件組都已 FileID 進行唯一標識。

file
· Hudi 表是有主鍵設計的,每條數據都已主鍵進行唯一標識。

· Hudi 表是有索引設計的。

結合上面的三個特性可以得出,Hudi 表的索引可以幫助我們快速地定位到某一條數據存在於某個分區的某個文件組中,然後對其進行 Update 操作,即重寫這部分文件組。

Iceberg 的數據更新實現

Iceberg 的官方定位是「面向海量數據分析場景的高效存儲格式」。所以它沒有像 Hudi 一樣模擬業務資料庫的設計模式(主鍵+索引)來實現數據更新,而是設計了更強大的文件組織形式來實現數據的 update 操作,詳見下圖:

file

• Snapshot:用戶的每次 commit 會產生一個新的 snapshot

• Manifest List:維護當前 snapshot 中所有的 manifest

• Manifest:維護當前 Manifest 下所有的 data files 和 delete files

• Data File:存儲數據的文件

• Delete File:存儲「刪除的數據」的文件

在上面的文件組織基礎上,我們可以看出,Iceberg 實現 update 的大致邏輯是:

· 先將要刪除的數據寫入 Delete File;

· 然後將「Data File」 JOIN 「Delete File」進行數據比對,實現數據更新。

當然,實現這兩步有很多技術細節:比如利用 Sequence Number 保障事務順序;Delete File 根據刪除時的文件狀態判斷是走 position delete 還是 equality delete 邏輯;引入 equality_ids 概念模擬主鍵等。

如何選擇

單純從數據更新能力這個角度來看:

· Hudi 憑藉文件組+索引+主鍵的設計模式,能夠有效減少數據文件的冗餘更新,提高數據更新效率。

· Iceberg 通過文件組織設計也能達到數據更新效果,但是每一次的 commit 都會產生新的文件,如果寫入/更新頻繁,小文件問題會比較嚴重。(雖然官方也配套提供了小文件治理能力,但是這部分的資源消耗、治理難度相對 Hudi 來說會比較大)

如何實踐應用

當我們確定了數據湖選型後,如何在生產環境中進行實踐應用就成為了下一個問題。

這裡就需要提前瞭解表類型這個概念,同一種數據湖表格式也有不同的類型區別,分別適用不同的場景:

• COW(Copy On Write):寫時複製表。在數據寫入/更新時,立即重寫原有數據文件,生成一份新的數據文件。

• MOR(Merge On Read):讀時合併表。在數據寫入/更新時,不修改原有文件,寫入新的日誌/文件,在之後數據被讀取到的時候,重寫數據文件。

基於這兩種表類型的特性差異,我們給出如下建議:

· 如果你的湖表寫入/更新不頻繁,主要用於支撐數據查詢/分析場景,那建議使用 COW 表。

· 如果你的湖表寫入/更新頻繁(甚至是用於實時開發場景的寫入),那建議使用 MOR 表。

總結

沒有最好的技術架構,只有最適合當前業務的技術架構。

關於數據湖的選型當然也不能簡單從數據更新能力這一單一緯度做出判斷。後續我們將繼續推出不同數據湖架構在 Schema 管理、查詢加速、批流一體等更多緯度的對比內容。歡迎大家和我們一起探討交流。

同時,袋鼠雲也有自己的數據湖倉一體化構建平臺 EasyLake,提供面向湖倉一體的數據湖管理分析服務,基於統一的元數據抽象構建一致性的數據訪問,提供海量數據的存儲管理和實時分析處理能力。
《數據治理行業實踐白皮書》下載地址:https://fs80.cn/380a4b

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

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


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

-Advertisement-
Play Games
更多相關文章
  • ​ 第一步、下載壓縮包 下載社區版的 MySQL,根據需求下載對應版本,其中有最小安裝版本。具體各個版本的區別,可以上網查詢,鏈接 MySQL :: Download MySQL Community Server 第二步,解壓壓縮包,並複製到安裝目錄 進入到壓縮包所在的文件夾,解壓分為兩次,第一次解 ...
  • 使用 NMCLI 配置靜態乙太網連接 要在命令行上配置乙太網連接,請使用 nmcli 工具。 例如,以下流程使用以下設置為 enp7s0 設備創建 NetworkManager 連接配置文件: 靜態 IPv4 地址 - 192.0.2.1 和 /24 子網掩碼 靜態 IPv6 地址 - 2001:d ...
  • 報錯信息: 在進入系統時,不能正常進入系統,出現了Give root password for maintenance(or type Control-D to continue):的報錯。 報錯原因: 1、在之前寫入的/etc/fstab文件有問題,導致系統在讀取的時候識別不到從而報錯。 解決方法 ...
  • 什麼是消息隊列? 假設你是一個快遞員,你需要將貨物從一個倉庫運到另一個倉庫。但是你發現自己的時間不夠用,需要另外請一個人來幫忙。那麼,你們之間如何進行協作呢? 一種方式是直接將貨物全部交給對方,但這樣存在風險:對方可能會出現問題,導致貨物丟失或損壞。 而另一種更安全的方式是,你將貨物分批發送給對方, ...
  • MySql存儲結構 參考視頻:MySql存儲結構 1.表空間 不同的存儲引擎在磁碟文件上的結構均不一致,這裡以InnoDB為例: CREATE TABLE t(id int(11)) Engine = INNODB; 在新表創建的過程中,InnoDB會在磁碟的data目錄下創建與這個表對應的兩個文件 ...
  • 您可以使用以下 SQL 語句刪除 MS SQL Server 表中重覆的行: WITH CTE AS ( SELECT ROW_NUMBER() OVER(PARTITION BY column1, column2, ... columnN ORDER BY (SELECT 0)) RN FROM ...
  • 摘要:DWS的PL/pgSQL函數/存儲過程中有一個特殊的語法PERFORM語法,用於執行語句但是丟棄執行結果的場景,常用於一些狀態判斷的場景。 本文分享自華為雲社區《GassDB(DWS)功能 -- 函數出參 #【玩轉PB級數倉GaussDB(DWS)】》,作者:譡里個檔。 DWS的PL/pgSQ ...
  • 大資管包括原銀保監監管下的銀行理財、信托、保險,原證監會監管下的公募基金、私募基金專戶及基金子公司、券商資管以及期貨資管。據統計,2022年底資管行業的資產管理規模也達到了136萬億元。 在《商業銀行理財業務監督管理辦法》《關於規範金融機構資產管理業務的指導意見》等理財新規、資管新規的要求下,大資管 ...
一周排行
    -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中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...