天天看點

【hadoop】淺析Hadoop檔案格式的類型與差異

   【IT168 技術】Hadoop 作為MR 的開源實作,一直以動态運作解析檔案格式并獲得比MPP資料庫快上幾倍的裝載速度為優勢。不過,MPP資料庫社群也一直批評Hadoop由于檔案格式并非為特定目的而建,是以序列化和反序列化的成本過高[7]。本文介紹Hadoop目前已有的幾種檔案格式,分析其特點、開銷及使用場景。希望加深讀者對Hadoop檔案格式及其影響性能的因素的了解。

  Hadoop 中的檔案格式

  1 SequenceFile

  SequenceFile是Hadoop API 提供的一種二進制檔案,它将資料以的形式序列化到檔案中。這種二進制檔案内部使用Hadoop 的标準的Writable 接口實作序列化和反序列化。它與Hadoop API中的MapFile 是互相相容的。Hive 中的SequenceFile 繼承自Hadoop API 的SequenceFile,不過它的key為空,使用value 存放實際的值, 這樣是為了避免MR 在運作map 階段的排序過程。如果你用Java API 編寫SequenceFile,并讓Hive 讀取的話,請確定使用value字段存放資料,否則你需要自定義讀取這種SequenceFile 的InputFormat class 和OutputFormat class。

【hadoop】淺析Hadoop檔案格式的類型與差異

圖1:Sequencefile 檔案結構

  2 RCFile

  RCFile是Hive推出的一種專門面向列的資料格式。 它遵循“先按列劃分,再垂直劃分”的設計理念。當查詢過程中,針對它并不關心的列時,它會在IO上跳過這些列。需要說明的是,RCFile在map階段從遠端拷貝仍然是拷貝整個資料塊,并且拷貝到本地目錄後RCFile并不是真正直接跳過不需要的列,并跳到需要讀取的列, 而是通過掃描每一個row group的頭部定義來實作的,但是在整個HDFS Block 級别的頭部并沒有定義每個列從哪個row group起始到哪個row group結束。是以在讀取所有列的情況下,RCFile的性能反而沒有SequenceFile高。

【hadoop】淺析Hadoop檔案格式的類型與差異

圖2:RCFile 檔案結構

  3 Avro

  Avro是一種用于支援資料密集型的二進制檔案格式。它的檔案格式更為緊湊,若要讀取大量資料時,Avro能夠提供更好的序列化和反序列化性能。并且Avro資料檔案天生是帶Schema定義的,是以它不需要開發者在API 級别實作自己的Writable對象。最近多個Hadoop 子項目都支援Avro 資料格式,如Pig 、Hive、Flume、Sqoop和Hcatalog。

【hadoop】淺析Hadoop檔案格式的類型與差異

圖3:Avro MR 檔案格式

  4. 文本格式

  除上面提到的3種二進制格式之外,文本格式的資料也是Hadoop中經常碰到的。如TextFile 、XML和JSON。 文本格式除了會占用更多磁盤資源外,對它的解析開銷一般會比二進制格式高幾十倍以上,尤其是XML 和JSON,它們的解析開銷比Textfile 還要大,是以強烈不建議在生産系統中使用這些格式進行儲存。 如果需要輸出這些格式,請在用戶端做相應的轉換操作。 文本格式經常會用于日志收集,資料庫導入,Hive預設配置也是使用文本格式,而且常常容易忘了壓縮,是以請確定使用了正确的格式。另外文本格式的一個缺點是它不具備類型和模式,比如銷售金額、利潤這類數值資料或者日期時間類型的資料,如果使用文本格式儲存,由于它們本身的字元串類型的長短不一,或者含有負數,導緻MR沒有辦法排序,是以往往需要将它們預處理成含有模式的二進制格式,這又導緻了不必要的預處理步驟的開銷和儲存資源的浪費。

  5. 外部格式

  Hadoop實際上支援任意檔案格式,隻要能夠實作對應的RecordWriter和RecordReader即可。其中資料庫格式也是會經常儲存在Hadoop中,比如Hbase,Mysql,Cassandra,MongoDB。 這些格式一般是為了避免大量的資料移動和快速裝載的需求而用的。他們的序列化和反序列化都是由這些資料庫格式的用戶端完成,并且檔案的儲存位置和資料布局(Data Layout)不由Hadoop控制,他們的檔案切分也不是按HDFS的塊大小(blocksize)進行切割。

繼續閱讀