快速了解HIVE檔案存盤格式
- 一 列式存盤和行式存盤
- 二 TEXTFILE格式
- 三 Sequence File
- a 、Sequence File優缺點
- b、Sequence File格式
- 1、未壓縮格式
- 2、基于record壓縮格式
- 3、基于block壓縮格式
- 四 Avro File
- a 、簡介
- b、應用場景
- c、結構
- d、優點
- e、缺點
- 五 ORC格式
- 六 PARQUET格式
- 七 Apache Arrow新一代的存盤格式
- a、Arrow簡介
- b、Arrow是如何提升資料移動性能的
- 八 BigData File Viewer工具
- a、介紹
- b、功能清單
Hive支持的存盤數的格式主要有:
TEXTFILE行式存盤) 、
SEQUENCEFILE(行式存盤)、
ORC 列式存盤)、
PARQUET 列式存盤),

一 列式存盤和行式存盤
a 、行式存盤:
一行資料接著一行資料做存盤,一行資料中的多個欄位的值都是物理相鄰的,
特點:
-
一行相關的資料是保存在一起,比較符合面向物件的思維,因為一行資料就是一條記錄
-
這種存盤格式比較方便進行INSERT/UPDATE操作
b 、列式存盤:
一列資料單獨存盤,多行資料的相同列的值,在物理存盤上是相鄰的
特點:
-
分析場景中往往需要讀大量行但是少數幾個列,在行存模式下,資料按行連續存盤,所有列的資料都存盤在一個block中,不參與計算的列在IO時也要全部讀出,讀取操作被嚴重放大,而列存模式下,只需要讀取參與計算的列即可,極大的減低了IO cost,加速了查詢,
-
同一列中的資料屬于同一型別,不需要針對不同資料型別頻繁切換壓縮演算法,壓縮效果顯著,列存往往有著高達十倍甚至更高的壓縮比,節省了大量的存盤空間,降低了存盤成本,

二 TEXTFILE格式
hive默認格式,資料不做壓縮,磁盤開銷大,資料決議開銷大,可結合Gzip、Bzip2使用(系統自動檢查,執行查詢時自動解壓),但使用這種方式,hive不會對資料進行切分,從而無法對資料進行并行操作,

三 Sequence File
Sequence File是Hadoop API提供的一種二進制檔案支持,這種二進制檔案直接將<key, value>鍵值對序列化到檔案中,

a 、Sequence File優缺點
優點
-
二進制格式存盤,比文本檔案更緊湊,
-
支持不同級別壓縮 基于Record或Block壓縮),
-
檔案可以拆分和并行處理,適用于MapReduce,
局限性
-
二進制格式檔案不方便查看,
-
特定于hadoop,只有Java API可用于與之進行互動,尚未提供多語言支持,
b、Sequence File格式
Hadoop Sequence File 是一個由二進制鍵/值對組成的,根據壓縮型別,有3種不同的Sequence File格式:未壓縮格式、record壓縮格式、block壓縮格式,
Sequence File由一個header和一個或多個record組成,以上三種格式均使用相同的header結構,如下所示:

前3個位元組為SEQ,表示該檔案是序列檔案,后跟一個位元組表示實際版本號 例如SEQ4或SEQ6),Header中其他也包括key、value class名字、 壓縮細節、metadata、Sync marker,Sync Marker同步標記,用于可以讀取任意位置的資料,
1、未壓縮格式

未壓縮的Sequence File檔案由header、record、sync三個部分組成,其中record包含了4個部分:record length 記錄長度)、key length 鍵長)、key、value,
每隔幾個record 100位元組左右)就有一個同步標記,
2、基于record壓縮格式

基于record壓縮的Sequence File檔案由header、record、sync三個部分組成,其中record包含了4個部分:record length 記錄長度)、key length 鍵長)、key、compressed value 被壓縮的值),
每隔幾個record 100位元組左右)就有一個同步標記,
3、基于block壓縮格式

基于block壓縮的Sequence File檔案由header、block、sync三個部分組成,
block指的是record block,可以理解為多個record記錄組成的塊,注意,這個block和HDFS中分塊存盤的block 128M)是不同的概念,
Block中包括:record條數、壓縮的key長度、壓縮的keys、壓縮的value長度、壓縮的values,每隔一個block就有一個同步標記,
block壓縮比record壓縮提供更好的壓縮率,使用Sequence File時,通常首選塊壓縮,
四 Avro File

a 、簡介
-
Apache Avro是與語言無關的序列化系統,由Hadoop創始人 Doug Cutting開發
-
Avro是基于行的存盤格式,它在每個檔案中都包含JSON格式的schema定義,從而提高了互操作性并允許schema的變化 洗掉列、添加列), 除了支持可切分以外,還支持塊壓縮,
-
Avro是一種自描述格式,它將資料的schema直接編碼存盤在檔案中,可以用來存盤復雜結構的資料,
-
Avro可以進行快速序列化,生成的序列化資料也比較小,
b、應用場景
-
適合于一次性需要將大量的列 資料比較寬)、寫入頻繁的場景
-
隨著更多存盤格式的發展,常用于Kafka和Druid中
c、結構

直接將一行資料序列化在一個block中
d、優點
-
Avro是與語言無關的資料序列化系統,
-
Avro將schema存盤在header中,資料是自描述的,
-
序列化和反序列化速度很快,
-
Avro檔案是可切分的、可壓縮的,非常適合在Hadoop生態系統中進行資料存盤,
e、缺點
-
如果我們只需要對資料檔案中的少數列進行操作,行式存盤效率較低,例如:我們讀取15列中的2列資料,基于行式存盤就需要讀取數百萬行的15列,而列式存盤就會比行式存盤方式高效
-
列式存盤因為是將同一列 類)的資料存盤在一起,壓縮率要比方式存盤高
五 ORC格式
Orc (Optimized Row Columnar)是hive 0.11版里引入的新的存盤格式,
可以看到每個Orc檔案由1個或多個stripe組成,每個stripe250MB大小,這個Stripe實際相當于RowGroup概念,不過大小由4MB->250MB,這樣能提升順序讀的吞吐率,每個Stripe里有三部分組成,分別是IndexData,Row Data,StripeFooter:

-
一個orc檔案可以分為若干個Stripe
-
一個stripe可以分為三個部分
-
indexData:某些列的索引資料
-
rowData :真正的資料存盤
-
StripFooter:stripe的元資料資訊
1)Index Data:一個輕量級的index,默認是每隔1W行做一個索引,這里做的索引只是記錄某行的各欄位在Row Data中的offset,
2)Row Data:存的是具體的資料,先取部分行,然后對這些行按列進行存盤,對每個列進行了編碼,分成多個Stream來存盤,
3)Stripe Footer:存的是各個stripe的元資料資訊
每個檔案有一個File Footer,這里面存的是每個Stripe的行數,每個Column的資料型別資訊等;每個檔案的尾部是一個PostScript,這里面記錄了整個檔案的壓縮型別以及FileFooter的長度資訊等,在讀取檔案時,會seek到檔案尾部讀PostScript,從里面決議到File Footer長度,再讀FileFooter,從里面決議到各個Stripe資訊,再讀各個Stripe,即從后往前讀,
六 PARQUET格式
Parquet是面向分析型業務的列式存盤格式,由Twitter和Cloudera合作開發,2015年5月從Apache的范訓器里畢業成為Apache頂級專案,
Parquet檔案是以二進制方式存盤的,所以是不可以直接讀取的,檔案中包括該檔案的資料和元資料,因此Parquet格式檔案是自決議的,
通常情況下,在存盤Parquet資料的時候會按照Block大小設定行組的大小,由于一般情況下每一個Mapper任務處理資料的最小單位是一個Block,這樣可以把每一個行組由一個Mapper任務處理,增大任務執行并行度,Parquet檔案的格式如下圖所示,

上圖展示了一個Parquet檔案的內容,一個檔案中可以存盤多個行組,檔案的首位都是該檔案的Magic Code,用于校驗它是否是一個Parquet檔案,Footer length記錄了檔案元資料的大小,通過該值和檔案長度可以計算出元資料的偏移量,檔案的元資料中包括每一個行組的元資料資訊和該檔案存盤資料的Schema資訊,除了檔案中每一個行組的元資料,每一頁的開始都會存盤該頁的元資料,在Parquet中,有三種型別的頁:資料頁、字典頁和索引頁,資料頁用于存盤當前行組中該列的值,字典頁存盤該列值的編碼字典,每一個列塊中最多包含一個字典頁,索引頁用來存盤當前行組下該列的索引,目前Parquet中還不支持索引頁,
七 Apache Arrow新一代的存盤格式

a、Arrow簡介
- Apache Arrow是一個跨語言平臺,是一種列式記憶體資料結構,主要用于構建資料系統,Apache Arrow在2016年2月17日作為頂級Apache專案引入,

-
Apache Arrow發展非常迅速,并且在未來會有更好的發展空間, 它可以在系統之間進行高效且快速的資料交換,而無需進行序列化,而這些成本已與其他系統 例如Thrift,Avro和Protoco* Buffers)相關聯,
-
每一個系統實作,它的方法 method)都有自己的記憶體存盤格式,在開發中,70%-80%的時間浪費在了序列化和反序列化上,

- Arrow促進了許多組件之間的通信, 例如,使用Python pandas)讀取復雜的檔案并將其轉換為Spark DataFrame,

b、Arrow是如何提升資料移動性能的
-
利用Arrow作為記憶體中資料表示的兩個程序可以將資料從一種方法“重定向”到另一種方法,而無需序列化或反序列化, 例如,Spark可以使用Python行程發送Arrow資料來執行用戶定義的函式,
-
無需進行反序列化,可以直接從啟用了Arrow的資料存盤系統中接收Arrow資料, 例如,Kudu可以將Arrow資料直接發送到Impala進行分析,
-
Arrow的設計針對嵌套結構化資料 例如在Impala或Spark Data框架中)的分析性能進行了優化,
八 BigData File Viewer工具
a、介紹
- 一個跨平臺 Windows,MAC,Linux)桌面應用程式,用于查看常見的大資料二進制格式,例如Parquet,ORC,AVRO等,支持本地檔案系統,HDFS,AWS S3等,

github地址:https://github.com/Eugene-Mark/bigdata-file-viewer
b、功能清單
-
打開并查看本地目錄中的Parquet,ORC和AVRO,HDFS,AWS S3等,
-
將二進制格式的資料轉換為文本格式的資料,例如CSV
-
支持復雜的資料型別,例如陣列,映射,結構等
-
支持Windows,MAC和Linux等多種平臺
-
代碼可擴展以涉及其他資料格式
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294895.html
標籤:其他
上一篇:Day362.RocketMQ概述 -RocketMQ
下一篇:Flink
