【大數據】Hudi 核心知識點詳解(一)

Hudi 核心知識點詳解(一)

  • 1.數據湖與數據倉庫的區別 ?
    • 1.1 數據倉庫
    • 1.2 數據湖
    • 1.3 兩者的區別
  • 2.Hudi 基礎功能
    • 2.1 Hudi 簡介
    • 2.2 Hudi 功能
    • 2.3 Hudi 的特性
    • 2.4 Hudi 的架構
    • 2.5 湖倉一體架構
  • 3.Hudi 數據管理
    • 3.1 Hudi 表數據結構
      • 3.1.1 .hoodie 文件
      • 3.1.2 數據文件
    • 3.2 數據存儲概述
    • 3.3 Metadata 元數據
    • 3.4 Index 索引
      • 索引策略
        • 工作負載 1:對事實表
        • 工作負載 2:對事件表
        • 工作負載 3:隨機更新 / 刪除維度表
    • 3.5 Data 數據

在 Flink 實時流中,經常會通過 Flink CDC 插件讀取 Mysql 數據,然后寫入 Hudi 中。所以在執行上述操作時,需要了解 Hudi 的基本概念以及操作原理,這樣在近實時往 Hudi 中寫數據時,遇到報錯問題,才能及時處理。

接下來將從以下幾方面全面闡述 Hudi 組件核心知識點。

  • 數據湖與數據倉庫的區別 ?
  • Hudi 基礎功能
  • Hudi 數據管理
  • Hudi 核心點解析

1.數據湖與數據倉庫的區別 ?

1.1 數據倉庫

  • 數據倉庫(英語:Data Warehouse,簡稱:數倉、DW),是一個用于 存儲分析報告 的數據系統。

  • 數據倉庫的目的是構建面向分析的集成化數據環境,分析結果為企業提供 決策支持Decision Support)。

在這里插入圖片描述

1.2 數據湖

  • 數據湖Data Lake)和數據庫、數據倉庫一樣,都是數據存儲的設計模式,現在企業的數據倉庫都會通過分層的方式將數據存儲在文件夾、文件中。

  • 數據湖是一個集中式數據存儲庫,用來存儲大量的原始數據,使用平面架構來存儲數據。

  • 定義:一個以原始格式(通常是對象塊或文件)存儲數據的系統或存儲庫,通常是所有企業數據的單一存儲。

  • 數據湖可以包括來自關系數據庫的結構化數據(行和列)、半結構化數據(CSV、日志、XML、JSON)、非結構化數據(電子郵件、文檔、PDF)和二進制數據(圖像、音頻、視頻)。

  • 數據湖中數據,用于報告、可視化、高級分析和機器學習等任務。

在這里插入圖片描述

1.3 兩者的區別

  • 數據倉庫是一個優化的數據庫,用于分析來自事務系統和業務線應用程序的關系數據。

  • 數據湖存儲來自業務線應用程序的關系數據,以及來自移動應用程序、IoT 設備和社交媒體的非關系數據。

特性
數據倉庫
數據湖
數據來自事務系統、運營數據庫和業務線應用程序的關系數據來自 IoT 設備、網站、移動應用程序、社交媒體和企業應用程序的非關系和關系數據
Schema設計在數據倉庫實施之前(寫入型 Schema)寫入在分析時(讀取型 Schema)
性價比更快查詢結果會帶來較高存儲成本更快查詢結果只需較低存儲成本
數據質量可作為重要事實依據的高度監管數據任何可以或無法進行監管的數據(例如原始數據)
用戶業務分析師數據科學家、數據開發人員和業務分析師(使用監管數據)
分析批處理報告、BI和可視化機器學習、預測分析、數據發現和分析

數據湖并不能替代數據倉庫,數據倉庫在高效的報表和可視化分析中仍有優勢。

2.Hudi 基礎功能

2.1 Hudi 簡介

Apache Hudi 由 Uber 開發并開源,該項目在 2016 年開始開發,并于 2017 年開源,2019 年 1 月進入 Apache 孵化器,且 2020 年 6 月稱為 Apache 頂級項目,目前最新版本:0.10.1 版本。

Hudi 一開始支持 Spark 進行數據攝入(批量 Batch 和流式 Streaming),從 0.7.0 版本開始,逐漸與 Flink 整合,主要在于 Flink SQL 整合,還支持 Flink SQL CDC。

在這里插入圖片描述

HudiHadoop Upserts anD Incrementals 的縮寫),是目前市面上流行的三大開源數據湖方案之一。

用于管理分布式文件系統 DFS 上大型分析數據集存儲。

簡單來說,Hudi 是一種針對分析型業務的、掃描優化的數據存儲抽象,它能夠使 DFS 數據集在分鐘級的時延內支持變更,也支持下游系統對這個數據集的增量處理。

2.2 Hudi 功能

  • ? Hudi 是在大數據存儲上的一個數據集,可以將 Change Logs 通過 upsert 的方式合并進 Hudi。
  • ? Hudi 對上可以暴露成一個普通 Hive 或 Spark 表,通過 API 或命令行可以獲取到增量修改的信息,繼續供下游消費。
  • ? Hudi 保管修改歷史,可以做時間旅行或回退。
  • ? Hudi 內部有主鍵到文件級的索引,默認是記錄到文件的布隆過濾器。

在這里插入圖片描述

2.3 Hudi 的特性

Apache Hudi 使得用戶能在 Hadoop 兼容的存儲之上存儲大量數據,同時它還提供兩種原語,不僅可以 批處理,還可以在數據湖上進行 流處理

1?? Update / Delete 記錄:Hudi 使用細粒度的文件 / 記錄級別索引來支持 Update / Delete 記錄,同時還提供寫操作的事務保證。查詢會處理最后一個提交的快照,并基于此輸出結果。

2?? 變更流:Hudi 對獲取數據變更提供了一流的支持:可以從給定的 時間點 獲取給定表中已 updated / inserted / deleted 的所有記錄的增量流,并解鎖新的查詢姿勢(類別)。

  • ? Apache Hudi 本身不存儲數據,僅僅管理數據。
  • ? Apache Hudi 也不分析數據,需要使用計算分析引擎,查詢和保存數據,比如 Spark 或 Flink。
  • ? 使用 Hudi 時,加載 jar 包,底層調用 API,所以需要依據使用大數據框架版本,編譯 Hudi 源碼,獲取對應依賴 jar 包。

在這里插入圖片描述

2.4 Hudi 的架構

在這里插入圖片描述

  • ? 通過 DeltaStreammer、Flink、Spark 等工具,將數據攝取到數據湖存儲,可使用 HDFS 作為數據湖的數據存儲。
  • ? 基于 HDFS 可以構建 Hudi 的數據湖。
  • ? Hudi 提供統一的訪問 Spark 數據源和 Flink 數據源。
  • ? 外部通過不同引擎,如:Spark、Flink、Presto、Hive、Impala、Aliyun DLA、AWS Redshit 訪問接口。

圖片

2.5 湖倉一體架構

Hudi 對于 Flink 友好支持以后,可以使用 Flink + Hudi 構建實時湖倉一體架構,數據的時效性可以到分鐘級,能很好的滿足業務準實時數倉的需求。

通過湖倉一體、流批一體,準實時場景下做到了:數據同源、同計算引擎、同存儲、同計算口徑。

在這里插入圖片描述

3.Hudi 數據管理

3.1 Hudi 表數據結構

Hudi 表的數據文件,可以使用操作系統的文件系統存儲,也可以使用 HDFS 這種分布式的文件系統存儲。為了后續分析性能和數據的可靠性,一般使用 HDFS 進行存儲。以 HDFS 存儲來看,一個 Hudi 表的存儲文件分為兩類。

在這里插入圖片描述

  • .hoodie 文件:由于 CRUD 的零散性,每一次的操作都會生成一個文件,這些小文件越來越多后,會嚴重影響 HDFS 的性能,Hudi 設計了一套文件合并機制。.hoodie 文件夾中存放了對應的 文件合并操作 相關的日志文件。
  • amricasasia 相關的路徑是 實際的數據文件,按分區存儲,分區的路徑 key 是可以指定的。

3.1.1 .hoodie 文件

Hudi 把隨著時間流逝,對表的一系列 CRUD 操作叫做 Timeline,Timeline 中某一次的操作,叫做 Instant

Hudi 的核心是維護 Timeline 在不同時間對表執行的所有操作,Instant 這有助于提供表的即時視圖,同時還有效地支持按到達順序檢索數據。Hudi Instant 由以下組件組成:

  • Instant Action:記錄本次操作是一次操作類型,數據提交COMMITS),還是 文件合并COMPACTION),或者是 文件清理CLEANS)。
  • Instant Time:本次操作發生的時間,通常是時間戳(例如:20190117010349),它按照動作開始時間的順序單調遞增。
  • State:操作的狀態,發起REQUESTED),進行中INFLIGHT),還是 已完成COMPLETED)。

.hoodie 文件夾中存放對應操作的狀態記錄:

在這里插入圖片描述

3.1.2 數據文件

Hudi 真實的數據文件使用 Parquet 文件格式存儲。

在這里插入圖片描述

其中包含一個 metadata 元數據文件和數據文件 parquet 列式存儲。

Hudi 為了實現數據的 CRUD,需要能夠唯一標識一條記錄,Hudi 將把數據集中的 唯一字段record key)+ 數據所在分區partition Path)聯合起來當做 數據的唯一鍵

3.2 數據存儲概述

Hudi 數據集的 組織目錄結構 與 Hive 表示非常相似,一份數據集對應這一個根目錄。數據集被 打散為多個分區,分區字段以文件夾形式存在,該文件夾包含該分區的所有文件。

在這里插入圖片描述

在根目錄下,每個分區都有唯一的分區路徑,每個分區數據存儲在多個文件中。

每個文件都有唯一的 fileId 和生成文件的 commit 標識。如果發生更新操作時,多個文件共享相同的 fileId,但會有不同的 commit

3.3 Metadata 元數據

時間軸Timeline)的形式將數據集上的各項操作元數據維護起來,以支持數據集的瞬態視圖,這部分元數據存儲于根目錄下的元數據目錄。一共有三種類型的元數據:

  • Commits:一個單獨的 commit 包含對數據集之上一批數據的一次原子寫入操作的相關信息。我們用單調遞增的時間戳來標識 commits,標定的是一次寫入操作的開始。
  • Cleans:用于清除數據集中不再被查詢所用到的舊版本文件的后臺活動。
  • Compactions:用于協調 Hudi 內部的數據結構差異的后臺活動。例如,將更新操作由基于行存的日志文件歸集到列存數據上。

圖片

3.4 Index 索引

Hudi 維護著一個索引,以支持在記錄 key 存在情況下,將新記錄的 key 快速映射到對應的 fileId

  • Bloom filter:存儲于數據文件頁腳。默認選項,不依賴外部系統實現。數據和索引始終保持一致。
  • Apache HBase:可高效查找一小批 key。在索引標記期間,此選項可能快幾秒鐘。

在這里插入圖片描述

索引策略

工作負載 1:對事實表

許多公司將大量事務數據存儲在 NoSQL 數據存儲中。例如,拼車情況下的行程表、股票買賣、電子商務網站中的訂單。這些表通常會隨著對最新數據的隨機更新而不斷增長,而長尾更新會針對較舊的數據,這可能是由于交易在以后結算 / 數據更正所致。換句話說,大多數更新進入最新的分區,很少有更新進入較舊的分區。

在這里插入圖片描述
對于這樣的工作負載,BLOOM 索引表現良好,因為索引查找 將基于大小合適的布隆過濾器修剪大量數據文件。此外,如果可以構造鍵,以使它們具有一定的順序,則要比較的文件數量會通過范圍修剪進一步減少。

Hudi 使用所有文件鍵范圍構建一個區間樹,并有效地過濾掉更新 / 刪除記錄中與任何鍵范圍不匹配的文件。

為了有效地將傳入的記錄鍵與布隆過濾器進行比較,即最小數量的布隆過濾器讀取和跨執行程序的統一工作分配,Hudi 利用輸入記錄的緩存并采用可以使用統計信息消除數據偏差的自定義分區器。有時,如果布隆過濾器誤報率很高,它可能會增加混洗的數據量以執行查找。

Hudi 支持動態布隆過濾器(使用啟用 hoodie.bloom.index.filter.type=DYNAMIC_V0),它根據存儲在給定文件中的記錄數調整其大小,以提供配置的誤報率。

工作負載 2:對事件表

事件流無處不在。來自 Apache Kafka 或類似消息總線的事件通常是事實表大小的 10 ? 100 10-100 10?100 倍,并且通常將 時間(事件的到達時間 / 處理時間)視為一等公民。

例如,物聯網事件流、點擊流數據、廣告印象 等。插入和更新僅跨越最后幾個分區,因為這些大多是僅附加數據。鑒于可以在端到端管道中的任何位置引入重復事件,因此在存儲到數據湖之前進行重復數據刪除是一項常見要求。

在這里插入圖片描述
一般來說,這是一個非常具有挑戰性的問題,需要以較低的成本解決。雖然,我們甚至可以使用鍵值存儲來使用 HBASE 索引執行重復數據刪除,但索引存儲成本會隨著事件的數量線性增長,因此可能會非常昂貴。

實際上,BLOOM 帶有范圍修剪的索引是這里的最佳解決方案。人們可以利用時間通常是一等公民這一事實并構造一個鍵,event_ts + event_id 例如插入的記錄具有單調遞增的鍵。即使在最新的表分區中,也可以通過修剪大量文件來產生巨大的回報。

工作負載 3:隨機更新 / 刪除維度表

這些類型的表格通常包含高維數據并保存參考數據,例如 用戶資料商家信息。這些是高保真表,其中更新通常很小,但也分布在許多分區和數據文件中,數據集從舊到新。通常,這些表也是未分區的,因為也沒有對這些表進行分區的好方法。

在這里插入圖片描述
如前所述,BLOOM 如果無法通過比較范圍 / 過濾器來刪除大量文件,則索引可能不會產生好處。在這樣的隨機寫入工作負載中,更新最終會觸及表中的大多數文件,因此布隆過濾器通常會根據一些傳入的更新指示所有文件的真陽性。因此,我們最終會比較范圍 / 過濾器,只是為了最終檢查所有文件的傳入更新。

SIMPLE 索引將更適合,因為它不進行任何基于預先修剪的操作,而是直接與每個數據文件中感興趣的字段連接 。HBASE 如果操作開銷是可接受的,并且可以為這些表提供更好的查找時間,則可以使用索引。

在使用全局索引時,用戶還應該考慮設置 hoodie.bloom.index.update.partition.path=truehoodie.simple.index.update.partition.path=true 處理分區路徑值可能因更新而改變的情況,例如用戶表按家鄉分區;用戶搬遷到不同的城市。這些表也是 Merge-On-Read 表類型的絕佳候選者。

3.5 Data 數據

Hudi 以兩種不同的存儲格式存儲所有攝取的數據,用戶可選擇滿足下列條件的任意數據格式:

  • 讀優化的列存格式ROFormat):缺省值為 Apache Parquet
  • 寫優化的行存格式WOFormat):缺省值為 Apache Avro

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211314.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211314.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211314.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C語言】位運算實現二進制數據處理及BCD碼轉換

文章目錄 1.編程實驗:按short和unsigned short類型分別對-12345進行左移2位和右移2位操作,并輸出結果。2.編程實驗:利用位運算實現BCD碼與十進制數之間的轉換,假設數據類型為unsigned char。3.編…

FPGA | Verilog基礎語法

這里寫自定義目錄標題 Case語句系統任務$dumpfile | 為所要創建的VCD文件指定文件名。$dumpvar | 指定需要記錄到VCD文件中的信號$fscanf$fread菜鳥教程連接 Case語句 case(case_expr)condition1 : true_statement1 ;condition2 : true_stat…

多線程(進階二:CAS)

目錄 一、CAS的簡單介紹 CAS邏輯(用偽代碼來描述) 二、CAS在多線程中簡單的使用 三、原子類自增的代碼分析 都看到這了,點個贊再走吧,謝謝謝謝謝 一、CAS的簡單介紹 CAS的全稱:“Compare And Swap”,字…

C語言——字符函數和字符串函數(一)

📝前言: 這篇文章對我最近學習的有關字符串的函數做一個總結和整理,主要講解字符函數和字符串函數(strlen,strcpy和strncpy,strcat和strncat)的使用方法,使用場景和一些注意事項&…

python常見庫的匯總

python常見庫 一、爬蟲二、界面開發三、圖片處理四、視頻處理、視頻剪輯五、音頻處理六、數據處理七、數據庫八、網頁開發九、神經學習、AI開發十、打包十一、Excel處理十二、微信十三、控制鼠標鍵盤十四、手柄十五、控制外設十六、郵箱十七、短信 一、爬蟲 Requests&#xff…

Java入門項目--螞蟻愛購

簡介 這是一個靠譜的Java入門項目實戰,名字叫螞蟻愛購。 從零開發項目,視頻加文檔,十天就能學會開發JavaWeb項目,教程路線是:搭建環境> 安裝軟件> 創建項目> 添加依賴和配置> 通過表生成代碼> 編寫Ja…

解鎖MySQL的威力:針對常見問題的快速解決指南

數據庫和表的創建 創建數據庫: CREATE DATABASE IF NOT EXISTS MyDatabase; USE MyDatabase;案例: 想象您要開始一個博客項目。首先,您需要一個地方來存儲所有的文章和用戶信息。上述命令幫助您創建了這樣一個存儲空間,名為MyDa…

Tomcat使用https方式連接

Tomcat使用https方式連接 攏共分兩步,第一步:生成密鑰。第二步:修改配置。 第一步:生成密鑰。 keytool -genkey -v -alias tomcat -keyalg RSA -validity 365 -keystore /usr/tomcat-8.5/conf/tomcat.keystore第二步&#xff1…

RocketMQ-源碼架構二

梳理一些比較完整,比較復雜的業務線 消息持久化設計 RocketMQ的持久化文件結構 消息持久化也就是將內存中的消息寫入到本地磁盤的過程。而磁盤IO操作通常是一個很耗性能,很慢的操作,所以,對消息持久化機制的設計,是…

華為機試真題 C++ 實現【字符串重新排列】

題目 給定一個字符串s,s包括以空格分隔的若干個單詞,請對s進行如下處理后輸出: 1、單詞內部調整:對每個單詞字母重新按字典序排序 2、單詞間順序調整: 1)統計每個單詞出現的次數,并按次數降序…

蒙特霍爾問題(選擇三扇門后的車與羊)及其貝葉斯定理數學解釋

1. 蒙特霍爾問題 有一個美國電視游戲節目叫做“Let’s Make a Deal”,游戲中參賽者將面對3扇關閉的門,其中一扇門背后有一輛汽車,另外兩扇門后是山羊,參賽者如果能猜中哪一扇門后是汽車,就可以得到它。 通常&#xf…

筆記68:Pytorch中repeat函數的用法

repeat 相當于一個broadcasting的機制 repeat(*sizes) 沿著指定的維度重復tensor。不同與expand(),本函數復制的是tensor中的數據。 import torch import torch.nn.functional as F import numpy as np a torch.Tensor(128,1,512) B a.repeat(1,5,1) print(B.s…

OpenGL 著色器程序的保存和加載(二進制)

背景 為了提高OpenGL 著色器程序的編譯和鏈接速度,我們可以將程序保存為二進制進行加載,可以大幅度提升加載效率。 方法 以下是加載和保存二進制程序的方法。 // 加載著色器程序的二進制文件到已創建的著色器程序中 bool loadPragram(const std::str…

javaee實驗:文件上傳及攔截器的使用

目錄 文件上傳ModelAttribute注解實驗目的實驗內容實驗過程項目結構編寫代碼結果展示 文件上傳 Spring MVC 提供 MultipartFile 接口作為參數來處理文件上傳。 MultipartFile 提供以下方法來獲取上傳的文件信息: ? getOriginalFilename 獲取上傳的文件名字&#x…

華為OD機試真題-測試用例執行計劃-2023年OD統一考試(C卷)

題目描述: 某個產品當前迭代周期內有N個特性( F1,F2,.......FN)需要進行覆蓋測試,每個特性都被評估了對應的優先級,特性使用其ID作為下標進行標識。 設計了M個測試用例(T1,T2......,TM ),每個用例對應了一個覆蓋特性的集合,測試用例使用其ID作為下標進行標識,測試用例…

特權FPGA學習筆記

C/C/system C-----vivado HLS------------->RTL門電路,省去了HDL語言的中間轉換,可以看作是C向C#的演進,基于zynq面向以前使用C的開發人員,但是個人覺得,HDL存在且未被C取代,工具的著眼點就是面向底層調…

Spring Cloud 與微服務學習總結(19)—— Spring Cloud Alibaba 之 Nacos 2.3.0 史上最大更新版本發布

Nacos 一個用于構建云原生應用的動態服務發現、配置管理和服務管理平臺,由阿里巴巴開源,致力于發現、配置和管理微服務。說白了,Nacos 就是充當微服務中的的注冊中心和配置中心。 Nacos 2.3.0 新特性 1. 反脆弱插件 Nacos 2.2.0 版本開始加入反脆弱插件,從 2.3.0 版本開…

飛天使-linux操作的一些技巧與知識點2

TCP 的三次握手 第一次,客戶端與服務端建立鏈接,需要發送請求連接的消息 第二次,服務端接口到數據后,返回一個確認的操作*(至此客戶端和服務端鏈路建立成功) 第三次,服務端還需要發送要與客戶端…

【Linux】探索Linux進程狀態 | 僵尸進程 | 孤兒進程

最近,我發現了一個超級強大的人工智能學習網站。它以通俗易懂的方式呈現復雜的概念,而且內容風趣幽默。我覺得它對大家可能會有所幫助,所以我在此分享。點擊這里跳轉到網站。 目錄 一、進程狀態1.1運行狀態1.2阻塞狀態1.3掛起狀態 二、具體L…

React中使用react-json-view展示JSON數據

文章目錄 一、前言1.1、在線demo1.2、Github倉庫 二、實踐2.1、安裝react-json-view2.2、組件封裝2.3、效果2.4、參數詳解2.4.1、src(必須) :JSON Object2.4.2、name:string或false2.4.3、theme:string2.4.4、style:object2.4.5、…