* 注:本文原創,轉載請註明出處,本人保留對未註明出處行爲的責任追究。html
a.數據壓縮數據庫
優勢: 1.節省本地空間 2.節省帶寬apache
缺點: 花時間app
1.MR中容許進行數據壓縮的地方有三個:oop
1)input起點 2)map處理以後 3)reduce處理以後進行存儲性能
2.壓縮格式spa
常見的壓縮計數有bzip二、gzip、lzo、snappy.它們之間的性能比較以下:.net
壓縮比 : bzip2>gzip>lzo = snappy ,bzip2最節省空間3d
解壓速度 :lzo = snappy > gzip > bzip2 , lzo解壓速度是最快的code
另外Google研發的snappy的壓縮格式,嵌入在hadoop中,由於其可靠性和性能的均衡性,很是受到你們歡迎。
snappy壓縮格式的性能與lzo差很少,都是屬於壓縮解壓塊,可是壓縮比高的類型。如下是它們的一些詳細參數:
壓縮比 | 壓縮速率 | 解壓速率 | |
gzip/deflate | 13.4% | 21MB/s | 118MB/s |
bzip2 | 13.2% | 2.4MB/s | 9.5MB/s |
lzo | 20.5% | 135MB/s | 410MB/s |
snappy | 22.2% | 172MB/s | 409MB/s |
(本表數據來源於博客: https://blog.csdn.net/zhouyan8603/article/details/82954459 , 感謝玉羽凌風!)
3.mr中如何使用數據壓縮?
剛纔談到了三個能夠進行壓縮的地方,這裏分別說明:
1)輸入時,hadoop依據文件格式進行自動識別並解壓,這個是自動的,不須要關心太多
2)在map以後有一個能夠壓縮的點,須要配置如下兩個參數進行壓縮:
mapreduce.map.output.compress - false/true - 在 map處理後是否啓用壓縮
mapreduce.map.output.compress.codec – 選擇編解碼器
3)在reduce以後有一個能夠壓縮的點,須要配置如下三個參數進行壓縮:
mapreduce.output.fileoutputformat.compress – false/true – 在 reduce後是否壓縮
mapreduce.output.fileoutputformat.compress.codc – 選擇編解碼器
mapreduce.output.fileoutputformat.compress.type – RECORD/BLOCK/NONE 其中RECORD是針對記錄的壓縮,BLOCK是針對塊的壓縮
其中使用RECORD壓縮率比較低,所以通常使用BLOCK。
**注:hadoop支持的編解碼器 - 配置中須要用到:
Zlib → org.apache.hadoop.io.compress.Default.Codec
其中Zlib是MR使用的默認壓縮格式,當指定上面的bool值爲true且沒有指定codec的狀況下,默認使用這個Codec
Gzip → org.apache.hadoop.io.compress.GzipCodec
Bzip2 → org.apache.hadoop.io.compress.BZip2Codec
Lzo → com.hadoop.compression.lzo.LzoCodec
Lz4 → org.apache.hadoop.io.coompress.Lz4Codec
Snappy → org.apache.hadoop.io.compress.SnappyCodec
其餘關於壓縮問題的補充: https://www.cnblogs.com/ggjucheng/archive/2012/04/22/2465580.html
4.hive中如何使用數據壓縮?
(注:本圖引自北風網)
1)Input處的數據壓縮,須要在建立表的時候指定
2)map以後的數據壓縮須要設置三個參數:
hive.exec.compress.intermediate - true
mapred.map.output.compress.codec – 選擇編解碼器
mapred.map.output.compress.codec - RECORD/BLOCK
3)reduce以後的數據壓縮須要設置三個參數:
hive.exec.compress.output - true
mapred.output.compression.codec - 編解壓器
mapred.output.compression.type - RECORD/BLOCK
b.數據存儲格式
在建立Hive表的時候,咱們能夠用STORED AS關鍵字來指定數據存儲格式。
Hadoop支持的常見的存儲格式有如下幾種:
1.hadoop支持的文件存儲格式,比較典型的有(須要記住):
* 按行存儲
SEQUENCEFILE TEXTFILE
* 按列存儲
RCFILE ORC PARQUET
2.行式存儲與列式存儲的比較
1)列式存儲每一列單獨摘出來存放,行式存儲按行存放。
這就致使行式存儲進行查詢時,須要把每一行完整的讀進去。而列式存儲只須要找到指定的幾行,讀這幾行就能夠。
2)所以列式存儲不適用於更新多,整表查詢的場景,適用於只查詢不更新,而且查詢主要集中於某幾列的場景。所以其經常使用於OLAP業務。
行式存儲在只查詢幾列數據的時候,性能不如列式 存儲。可是它靈活能夠變更,適用於修改、實時交互的場景。所以經常使用於OLTP業務。
* 注意:HBase 的「列式數據庫」是指數據的邏輯模型是支持列可擴展的,而實際的存儲模型是JSON實現的行式存儲。
企業裏用的比較多的列式壓縮式ORC以及Apache的Parquet.
(來源:https://hortonworks.com/blog/orcfile-in-hdp-2-better-compression-better-performance/)
在上圖中,咱們能夠看到不一樣存儲格式,佔用的存儲空間不一樣。
3.ORCFile的存儲格式
感謝 https://www.cnblogs.com/ITtangtang/p/7677912.html !
4.Parquet存儲格式
TODO