Apache Hudi的写时复制和读时合并
Apache Hudi
http://hudi.apache.org/
http://hudi.apache.org/docs/quick-start-guide.html
Hudi是什么
Hudi將流處理帶到大數據,提供新數據,同時比傳統批處理效率高一個數量級。
Hudi可以幫助你構建高效的數據湖,解決一些最復雜的底層存儲管理問題,同時將數據更快地交給數據分析師,工程師和科學家。
Hudi不是什么
Hudi不是針對任何OLTP案例而設計的,在這些情況下,通常你使用的是現有的NoSQL / RDBMS數據存儲。Hudi無法替代你的內存分析數據庫(至少現在還沒有!)。Hudi支持在幾分鐘內實現近乎實時的攝取,從而權衡了延遲以進行有效的批處理。
增量處理
增量處理僅是指以流處理方式編寫微型批處理程序。典型的批處理作業每隔幾個小時就會消費所有輸入并重新計算所有輸出。典型的流處理作業會連續/每隔幾秒鐘消費一些新的輸入并重新計算新的/更改以輸出。盡管以批處理方式重新計算所有輸出可能會更簡單,但這很浪費并且耗費昂貴的資源。Hudi具有以流方式編寫相同批處理管道的能力,每隔幾分鐘運行一次。
雖然可將其稱為流處理,但我們更愿意稱其為增量處理,以區別于使用Apache Flink,Apache Apex或Apache Kafka Streams構建的純流處理管道。
?
Hudi基于MVCC設計
將數據寫入parquet/基本文件以及包含對基本文件所做更改的日志文件的不同版本。
存儲類型和視圖
Hudi存儲類型定義了如何在DFS上對數據進行索引和布局以及如何在這種組織之上實現上述原語和時間軸活動(即如何寫入數據)。
反過來,視圖定義了基礎數據如何暴露給查詢(即如何讀取數據)。
| 存儲類型 | 支持的視圖 |
|---|---|
| 寫時復制 | 讀優化 + 增量 |
| 讀時合并 | 讀優化 + 增量 + 近實時 |
?
兩種存儲類型:
寫時復制(copy on write):僅使用列式文件(parquet)存儲數據。在寫入/更新數據時,直接同步合并原文件,生成新版本的基文件(需要重寫整個列數據文件,即使只有一個字節的新數據被提交)。此存儲類型下,寫入數據非常昂貴,而讀取的成本沒有增加,所以適合頻繁讀的工作負載,因為數據集的最新版本在列式文件中始終可用,以進行高效的查詢。
讀時合并(merge on read):使用列式(parquet)與行式(avro)文件組合,進行數據存儲。在更新記錄時,更新到增量文件中(avro),然后進行異步(或同步)的compaction,創建列式文件(parquet)的新版本。此存儲類型適合頻繁寫的工作負載,因為新記錄是以appending 的模式寫入增量文件中。但是在讀取數據集時,需要將增量文件與舊文件進行合并,生成列式文件。
?
存儲數據的視圖(查詢模式):
讀優化視圖(Read Optimized view):直接query 基文件(數據集的最新快照),也就是列式文件(如parquet)。相較于非Hudi列式數據集,有相同的列式查詢性能
增量視圖(Incremental View):僅query新寫入數據集的文件,也就是指定一個commit/compaction,query此之后的新數據。
實時視圖(Real-time View):query最新基文件與增量文件。此視圖通過將最新的基文件(parquet)與增量文件(avro)進行動態合并,然后進行query。可以提供近實時的數據(會有幾分鐘的延遲)
?
寫時復制存儲
以下內容說明了將數據寫入寫時復制存儲并在其上運行兩個查詢時,它是如何工作的:
讀時合并存儲
以下內容說明了存儲的工作方式,并顯示了對近實時表和讀優化表的查詢:
?
參考:
https://www.cnblogs.com/apachehudi/p/12014919.html
https://www.cnblogs.com/zackstang/p/11912994.html
總結
以上是生活随笔為你收集整理的Apache Hudi的写时复制和读时合并的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB分布式原理以及read-p
- 下一篇: 甩字开头的四字成语有哪些?