大數據存儲parquet和orc文件格式詳解

越來越多的企業開始使用Hadoop集群來構建數據湖,以存儲原始的結構化、半結構化以及非結構化數據,供數據分析專家以及數據科學家來使用。

在Hadoop上存儲數據時,您有很多種選擇。數據可以以JSON、XML或CSV文件等人類可讀格式被提取到Hadoop集群的數據湖中,但這並不意味著以這種原始結構來存儲是的最佳方法。

實際上,使用這些原始格式將數據存儲於Hadoop中,由於這些文件格式不能以並行方式存儲,導致效率往往是非常低的。

幸運的是,在大數據社區已經給出兩種種可用於Hadoop集群的優化文件格式:ORC和Parquet。雖然這些文件格式具有一些相似之處,但它們各自都的優點和缺點。

ORC存儲

ORC(optimizedRC File) 存儲源自RC(RecordCloimnar File)這種存儲格式,RC是一種列式存儲引擎,主要是在壓縮編碼,查詢性能方面做了優化,但是對schema演化(修改schema需要重新生成數據)支持較差,.RC/ORC最初是在Hive中得到使用,最後發展勢頭不錯,獨立成一個單獨的項目.Hive1.xbanbendu版本對事物和update操作的支持,便是給予ORC實現的(其他存儲格式暫不支持).

ORC發展到今天,已經具備一些非常高級的功能,比如支持update操作,支持ACID,支持struct,array複雜類型.你可以使用複雜類型構建一個類似parquet的嵌套式數據架構,但層數非常多時,寫起來非常麻煩和複雜,而parquet提供的schema表達方式更容易表示出多級嵌套的數據類型.

文件結構

ORC文件以二進制方式存儲,所以是不可以直接讀取,ORC文件也是自解析的,它包含許多的元數據,這些元數據都是同構ProtoBuffer進行序列化的。ORC的文件結構如下圖,其中涉及到如下的概念:

  • ORC文件:保存在文件系統上的普通二進制文件,一個ORC文件中可以包含多個stripe,每一個stripe包含多條記錄,這些記錄按照列進行獨立存儲,對應到Parquet中的row group的概念。
  • 文件級元數據:包括文件的描述信息PostScript、文件meta信息(包括整個文件的統計信息)、所有stripe的信息和文件schema信息。
  • stripe:一組行形成一個stripe,每次讀取文件是以行組為單位的,一般為HDFS的塊大小,保存了每一列的索引和數據。
  • stripe元數據:保存stripe的位置、每一個列的在該stripe的統計信息以及所有的stream類型和位置。
  • row group:索引的最小單位,一個stripe中包含多個row group,默認為10000個值組成。
  • stream:一個stream表示文件中一段有效的數據,包括索引和數據兩類。索引stream保存每一個row group的位置和統計信息,數據stream包括多種類型的數據,具體需要哪幾種是由該列類型和編碼方式決定。
大數據存儲parquet和orc文件格式詳解

Parquet存儲

源自google Dremel 系統,Parquet 相當一Dremel中的數據存儲引擎,而Apache頂級開源醒目 Drill正式Dremel的開源實現.

Apache Parquet 最初的設計動機是存儲嵌套式數據,比如Protocolbuffer thrift json 等 將這類數據存儲成列式格式以方便對其高效壓縮和編碼,且使用更少的IO操作取出需要的數據,也是Parquet 相比於ORC的優勢,它能透明的將protobuf 和thrift被廣泛的使用的今天,於parquet 進行集成,是一件非常容易和自然地事情,除了上述優勢外,相比於ORC,Parquet 沒有太多其他可圈可點的地方,比如他不支持uodate操作(數據寫成後不可修改),不支持ACID等.

文件結構

通常情況下,在存儲Parquet數據的時候會按照Block大小設置行組的大小,由於一般情況下每一個Mapper任務處理數據的最小單位是一個Block,這樣可以把每一個行組由一個Mapper任務處理,增大任務執行並行度。Parquet文件的格式如下圖所示。

大數據存儲parquet和orc文件格式詳解

上圖展示了一個Parquet文件的內容,一個文件中可以存儲多個行組,文件的首位都是該文件的Magic Code,用於校驗它是否是一個Parquet文件,Footer length了文件元數據的大小,通過該值和文件長度可以計算出元數據的偏移量,文件的元數據中包括每一個行組的元數據信息和該文件存儲數據的Schema信息。除了文件中每一個行組的元數據,每一頁的開始都會存儲該頁的元數據,在Parquet中,有三種類型的頁:數據頁、字典頁和索引頁。數據頁用於存儲當前行組中該列的值,字典頁存儲該列值的編碼字典,每一個列塊中最多包含一個字典頁,索引頁用來存儲當前行組下該列的索引,目前Parquet中還不支持索引頁,但是在後面的版本中增加

對比

大數據存儲parquet和orc文件格式詳解

大數據存儲parquet和orc文件格式詳解


分享到:


相關文章: