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)