Hive0.14數據存儲優化

1.hive數據存儲優化
   1>對於需要經常連接查詢的表一定要建立分區和桶。分區的意義在於列裁剪數據,桶的意義在於並行計算
(因爲用來做桶的列通過hash後分布在各自桶裏,在連接時並行進行桶與桶之間的連接即可。(ORC格式的stripes文件同樣有這個功能後面講到))
        要使用以上這個特性需要在建表時構建表的分區結構和分桶結構。這個行爲發生在數據存儲環節。
   2> hive存儲文件格式介紹:
        1》textfile--原生的文本存儲格式,行存儲,可以用bzip,gzip壓縮,但是TEXTFILE在壓縮後不能發揮MapReduce的並行處理能力。
        2》sequencefile序列文件--行存儲,hadoop提供的文件存儲格式(二進制文件)。有record,block,none三種壓縮格式。(可以分割,壓縮默認使用block壓縮格式。)
              create table test2(str STRING)  
              STORED AS SEQUENCEFILE;  
              設置這兩個參數:
              hive.exec.compress.output=true;  
              io.seqfile.compression.type=BLOCK;  
        3》RCFile--(Row colums file)行列存儲相結合的存儲格式,首先按相同行在一個塊上(避免分散在不同塊上產生多餘的掃描),然後塊按列的方式存儲 以方便快速的索引和存取列。(數據寫入時時間代價比較大,但是查詢性能有很大提升,同時也是Lazy解壓)
        create table test3(str STRING)  
        STORED AS RCFILE;
         4》ORCFile--(Optimalized Row colums File)優化過的RCFile。
               相比RCFile有以下的優點:
                1)一個task只輸出一個文件(幾個行塊文件組成一個大的文件),減小碎片文件率。
                2)在列塊中每個列存有行索引文件方便快速定位行。
                3)可以使用RecordReader並行的讀多個塊或多個列。
                4)有多種索引文件記錄行信息和列信息。
               
              ORCFile的文件結構.
               
                index Data文件保存每列的最大和最小值以及列的行索引。
                fileFooter文件保存每個塊有多少行,每列的數據類型,列上的一些聚合信息。
                Stripe foooter包含文件流信息的目錄
                row data保存行的信息。
                ORCFile的一些參數:
                orc.compress=[ZLIB,NONE,SNAPPY]
                orc.compress.size=262144
                orc.stripe.size=268435456
                orc.row.index.stride=10000
                orc.create.index=true
           5》自定義文件輸入輸出格式:
        inputformat 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextInputFormat'  
        outputformat 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextOutputFormat';
             
    3>各種文件格式數據加載,壓縮比率,查詢響應橫向比較:
         不管什麼文件格式建議使用gzip壓縮格式,原因是gzip在時間和空間效率上都比較平衡:
          
    
           在數據加載性能方面:sequencefile優於textfile優於rcfile。
           在查詢效率方面:rcfile優於sequencefile優於textfile。
           在存儲成本方面:rcfile優於sequencefile優於textfile。
           顯而易見,我們不應該使用textfile這種文件格式。相反,在類似一次加載多次查詢的場景,應該使用rcfile這種格式。
測試結果數據:

 

 
TextFile
ORCFile
存儲效率(50G)
50G
9G
Tablescan效率
80s
40s
mapTask數
175個
36個

 

下表是一次CPU 的開銷:

 

rank

self

accum

count

trace

method

20       

0.48%

79.64%

65

315554

org.apache.hadoop.hive.ql.io.RCFile$Reader.getCurrentRow

28

0.24%

82.07%

32

315292

org.apache.hadoop.hive.serde2.columnar.ColumnarStruct.init

55

0.10%

85.98%

14

315788

org.apache.hadoop.hive.ql.io.RCFileRecordReader.getPos

56

0.10%

86.08%

14

315797

org.apache.hadoop.hive.ql.io.RCFileRecordReader.next


 
TRACE 315554: (thread=200001) org.apache.hadoop.hive.ql.io.RCFile$Reader.getCurrentRow(RCFile.java:1434) org.apache.hadoop.hive.ql.io.RCFileRecordReader.next(RCFileRecordReader.java:88) org.apache.hadoop.hive.ql.io.RCFileRecordReader.next(RCFileRecordReader.java:39) org.apache.hadoop.hive.ql.io.CombineHiveRecordReader.doNext(CombineHiveRecordReader.java:98) org.apache.hadoop.hive.ql.io.CombineHiveRecordReader.doNext(CombineHiveRecordReader.java:42) org.apache.hadoop.hive.ql.io.HiveContextAwareRecordReader.next(HiveContextAwareRecordReader.java:67)
發佈了27 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章