Hive存儲格式之RCFile詳解,RCFile的過去現在和未來

来源:https://www.cnblogs.com/lubians/archive/2022/08/14/16586194.html
-Advertisement-
Play Games

我在整理Hive的存儲格式和壓縮格式,本來打算一篇發出來,結果其中一小節就有很多內容,於是打算寫成Hive存儲格式和壓縮格式系列。 本節主要講一下Hive存儲格式最早的典型的列式存儲格式RCFile。 綜述 RCFile(Record Columnar File)文件格式是FaceBook開源的一種 ...


我在整理Hive的存儲格式和壓縮格式,本來打算一篇發出來,結果其中一小節就有很多內容,於是打算寫成Hive存儲格式和壓縮格式系列。

本節主要講一下Hive存儲格式最早的典型的列式存儲格式RCFile。

綜述

RCFile(Record Columnar File)文件格式是FaceBook開源的一種Hive的文件存儲格式,遵循“首先水平分區,然後垂直分區”的設計理念。首先將數據水平分為幾個行組,這樣每一行數據就可以保證存儲在同一個集群節點,然後對每個行組內數據進行垂直劃分,按列存儲。

下麵通過文件存儲結構來引入RCFile的詳細介紹。文件存儲結構主要有行存儲結構,列存儲結構和混合存儲結構。

1.行存儲存儲結構

行存儲(row-store)結構在傳統的一刀切的資料庫系統 中占主導地位。使用這種結構,關係記錄被組織在一個n元存儲模型中。一個記錄的所有欄位都按它們出現的順序依次填充。記錄被連續地放置在一個磁碟頁中。下圖給出了一個示例,展示瞭如何在HDFS塊中的行存儲結構中放置表。

下圖為HDFS block中基於行存儲示意圖
HDFS block中基於行存儲示意圖

1.1 優點

行存儲保證了相同記錄的所有欄位都在同一個集群節點,具備快速數據載入和動態負載的高適應能力。

1.2 缺點

在當查詢僅僅針對所有列中少數幾列時,它就不能直接定位到所需列而跳過不需要的列,不太滿足快速的查詢響應時間的要求。由於混合著不同數據域的列,行存儲不易獲得一個極高的壓縮比。

儘管通過熵編碼和利用列相關性的行存儲可以有比列存儲更好的數據壓縮比,但這同樣也會因為複雜的數據存儲實現導致很高的數據解壓縮開銷。

2.列式存儲存儲結構

列式存儲(column-group)是基於讀取優化的數據倉庫系統的面向列的存儲模型,在列式存儲中,一個關係被垂直劃分為幾個子集。有兩種存儲方案。

第一種是每一列放在一個子集中,常見一些實驗系統中,我們稱之為列存儲(column-store)。

第二種是將每個關係的所有列組織成不同的列組,並且通常允許多個列組之間的列重覆。Hbase的列簇設計就是一種類似方案,我們稱之為列組(column-group)。

也就是說我們通常所說的列式存儲其實是列組存儲

如下圖,列A和列B存儲在同一個列組中,而列C和列D存儲在兩個獨立的列組中。

下圖為HDFS block中基於列存儲示意圖

2.1 優點

列式結構使得在查詢時能夠直接讀取需要的列而避免不必要的列的讀取。

通過壓縮同一數據域內的每個列,可以有一個更好的壓縮比。

2.2 缺點

由於元組重構的高開銷,不能提供基於Hadoop系統的快速查詢處理能力。

缺點詳細解釋版本:列存儲不能保證同一記錄中所有的欄位都位於同一個集群節點,如上圖,一個記錄的四個欄位存儲在三個HDFS塊中,它們可能位於不同的節點。因此,查詢一條完整的記錄將導致多個集群節點之間的網路進行大量的數據傳輸,必然會慢。集群中過多的網路傳輸是一個集群增長的瓶頸,如果可能的話應該避免。

列組和物化視圖類似(提前載入好查詢數據),因此它可以避免記錄重構的開銷(同一個塊中),但是,它不能滿足快速適應動態工作負載的要求,除非將所有的查詢可能都構建為列組,這會有極高的數據冗餘。

關於物化視圖,開源資料庫postgresql 做了很好的支持,有機會單獨開篇講一講。

3.RCFile存儲思想-混合存儲(PAX)

混合存儲的核心,先水平分區,再垂直分區。

它採用了一種混合放置結構,旨在提高CPU緩存性能。對於來自不同列多個值的記錄,PAX不是將這些欄位值放在不同的磁碟頁中,而是將它們放在單個磁碟頁中,以保存用於記錄重構的其他操作。

在每個磁碟頁面中,PAX使用頁面頭來存儲一個指向指針,該指針指向一個用來存儲屬於每個列的所有欄位的迷你頁面。

3.1 優點

與行存儲區一樣,PAX對各種動態查詢工作負載具有很強的自適應能力。

3.2 缺點

由於PAX主要是為了提高載入數據集的CPU緩存利用率的性能,因此PAX不能直接滿足高存儲空間利用率和快速查詢處理速度的要求,原因有以下三個方面:

  • PAX與數據壓縮無關,僅僅提供了一個執行列級數據壓縮的可能。而數據壓縮對於緩存優化不是必需的,但對於大型數據處理系統非常重要。

  • PAX不能提高I/O性能,因為它不會改變頁面的實際內容。這限制了我們實現在大規模增長的數據集上對大量磁碟掃描進行快速查詢處理的目標。

  • 受傳統DBMS引擎中的頁面級數據操作的限制,PAX使用一個固定的頁面作為數據記錄組織的基本單元。通過如此固定的大小,PAX無法有效地存儲大型數據處理系統中不同的數據資源類型。

4.RCFile

RCFile應用了PAX中的“首先水平分區,然後垂直分區”的概念。結合了行存儲和列存儲的優點,從行存儲的角度來看,RCFile保證了同一行數據位於同一節點,從列存儲的角度來看,RCFile可以利用列級的數據壓縮,並跳過不必要的列讀取。

那麼它是怎麼做到的呢?我們且看下文,RCFile的五個特性。

4.1 數據組成

如下圖,在每個HDFS塊中,RCFile使用行組作為基本單位來組織數據。存儲在HDFS塊中的所有記錄都被劃分成了行組。對於一個表,所有的行組大小都相同。一個HDFS塊只能有一個或者多個行組。

一個行組由三部分組成,第一部分是行組開頭的同步標記,用於指向在一個HDFS塊兩個連續的行組。第二部分是行組的元數據頭,存儲此行組中有多少記錄,每列有多少位元組以及某列中每個欄位中有多少位元組等信息。第三部分是表數據,實際上是一個列存儲區,同一列中所有欄位都連續的存儲在一起,如下圖中,首先存儲A列所有數據,然後存儲B列所有數據。

HDFS block上RCFile存儲示意圖

4.2 數據壓縮

RCFile在數據壓縮上是將每個行組的元數據頭部分和表數據部分分別壓縮。

元數據頭使用RLE演算法進行壓縮,方便快速查找數據元數據信息。

RLE演算法詳解,有空寫(課本數據結構一書中有介紹)。

表數據部分沒有作為一個整體進行壓縮,而是將每一列都單獨使用Gzip進行壓縮,以獲得更高的壓縮比。

RCFile允許擴展可選擇每一列根據不同數據類型和數據分佈來使用不同的壓縮演算法,使其壓縮達到最佳,這是RCFile的優化和發展方向。但似乎有點過於笨重。

4.3 數據寫入

RCFile存儲方式導致了它不支持數據修改,由此Hive使用RCFile存儲是不支持數據更新,只支持數據覆蓋或者數據追加模式。

4.4 數據讀取和懶解壓縮

上文提到表數據壓縮使用Gzip,Gzip具有高壓縮比,但是解壓縮也有比較高的開銷,那這個是如何避免的呢?

通過只讀取給定查詢的元數據頭和行組中所需要的列(跳過不需要的列)並且結合懶解壓縮方式(如果該行列數據沒有所需要的欄位值,則不解壓縮該數據)來獲得I/O優勢,降低解壓縮開銷,本質上並沒有提升I/O性能,只是少讀了。

4.5 行組大小

合適的行組大小能夠提升數據讀取性能,降低數據存儲。顯然它由兩個因素決定,壓縮比和數據讀取性能。

大的行組能夠提升壓縮比,降低表存儲,但是可能會損害數據讀取性能,小的行組能夠提升數據讀取性能,但是卻損失了存儲空間。

RCFile預設設置是4MB,用戶可以通過參數調節行組大小。

需要說明的是,RCFile在map階段從 遠端拷貝仍然是拷貝整個數據塊,並且拷貝到本地目錄後RCFile並不是真正直接跳過不需要的列,並跳到需要讀取的列, 而是通過掃描每一個row group的頭部定義來實現的,但是在整個HDFS Block 級別的頭部並沒有定義每個列從哪個row group起始到哪個row group結束。所以在讀取所有列的情況下,RCFile的性能反而沒有SequenceFile高。

4.6 Hive使用RCFile示例:
-- 創建RCFile格式表
create table if not exists rcfile_temp(
	id int,
  name string,
  gender int,
  remark string
)
row format delimited fields terminated by ','
stored as rcfile;
-- 插入數據(自帶壓縮格式,就不需要使用壓縮參數了)
insert overwrite table rcfile_temp
select * from rcfile_temp;

RCFile還提供了豐富的API,支持開發者進行二次引用,這裡就不一一詳述了。

下期預告,講講和RCFile的優化版ORC File,具體是怎樣發揚了RCFile的優點,又是怎樣解決了所有列讀取的性能問題。

上一篇:什麼是hive的靜態分區和動態分區,它們又有什麼區別呢?hive動態分區詳解

按例,我的個人公眾號:魯邊社,歡迎關註
魯邊社

後臺回覆關鍵字 hive,隨機贈送一本魯邊備註版珍藏大數據書籍。


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

-Advertisement-
Play Games
更多相關文章
  • ​ /* *作者:呆萌老師 *☑csdn認證講師 *☑51cto高級講師 *☑騰訊課堂認證講師 *☑網易雲課堂認證講師 *☑華為開發者學堂認證講師 *☑愛奇藝千人名師計劃成員 *在這裡給大家分享技術、知識和生活 *各種乾貨,記得關註哦! *vx:it_daimeng */ 1 自定義標簽概述 1.1 ...
  • 面試官考察Java引用會問到強引用、弱引用、軟引用、虛引用,具體有什麼區別?本篇單獨來詳解 @mikechen Java引用 從JDK 1.2版本開始,對象的引用被劃分為4種級別,從而使程式能更加靈活地控制對象的生命周期,這4種級別由高到低依次為:強引用、軟引用、弱引用和虛引用。 強引用 強引用是最 ...
  • 如果程式用到了併發技術,那就要特別留意這種情況:一段代碼需要修改數據,同時其他代碼需要訪問同一個數據。 這種情況就需要考慮同步地訪問數據。 如果下麵三個條件都滿足,就必須用同步來保護共用的數據。 多段代碼正在併發運行; 這幾段代碼在訪問(讀或寫)同一個數據; 至少有一段代碼在修改(寫)數據。 一 阻 ...
  • .NetCore基於SqlSugar和Aop的工作單元模式(UnitOfWork)實現 Unit Of Work 是什麼 Unit Of Work模式,即工作單元,它是一種數據訪問模式。它是用來維護一個由已經被業務修改(如增加、刪除和更新等)的業務對象組成的列表。它負責協調這些業務對象的持久化工作及 ...
  • 名字解析的作用: TCP/IP網路中,設備之間的通信依賴IP地址來實現,但是IP地址不好記憶,所以就將每一臺設備用一個名字來進行標識,但是這個名字電腦不能解析。所以就需要藉助名字解析服務來實現將名字解析為IP地址。 主機名和功能變數名稱的聯繫 主機名: 主機名:電腦的名字,用於唯一標識一臺設備 功能變數名稱: ...
  • Hackaday 在三月份的時候介紹了一款最小的MCU, 華大的 HC32L110B6YA-CSP16TR, CSP16封裝, 尺寸有隻1.6mm x 1.4mm, 還不及一粒米大. HC32L110 (以及其他的Cortex M0華大MCU) 在 Windows 下可以選擇的燒錄選項比較多, 以下... ...
  • 游戲玩家一定會上手的游戲就是拳皇系列了吧,其中最經典的就是拳皇97,現為大家分享的是拳皇97mac版,熟悉的場景,熟悉的操作,原來Mac上打街機也可以這麼der兒,親測拳皇97 for Mac 支持M1 Mac,喜歡的話就來體驗吧。 詳情:拳皇97 for Mac(KOF97) 支持M1 拳皇97m ...
  • mac屏幕解析度如何調整?switchresx mac版可以為您提供控制顯示器解析度所需的工具和功能。您可以管理從MacBook Retina顯示器和Cinema Displays到電視機和投影儀的任何解析度。而且switchresx應用程式能夠根據您當前使用的應用程式自動更改Mac的顯示或顯示分辨 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...