資料做壓縮和解壓縮會增加CPU的開銷,但可以最大程度的減少檔案所需的磁盤空間和網絡I/O的開銷,是以最好對那些I/O密集型的作業使用資料壓縮,cpu密集型,使用壓縮反而會降低性能。
而hive中間結果是map輸出傳給reduce,是以應該使用低cpu開銷和高壓縮效率,一般最好使用snappy。
------------------------------------------------------------------------------
hive表的存儲格式有(參見http://blog.csdn.net/longshenlmj/article/details/51702343)
TEXTFILE
SEQUENCEFILE(三種壓縮選擇:NONE, RECORD, BLOCK。 Record壓縮率低,一般建議使用BLOCK壓縮)
RCFILE
ORC
自定義格式
hive表存儲格式是表自身的存儲結構,内部涉及存儲資料的結構,查詢方法,索引建構等等。支援的資料都是hadoop預設支援的。如txt格式檔案,或壓縮格式zip、lzo、br2等等。hive外部表隻能直接加載這些格式的資料。
源資料在雲上(hdfs)壓縮存儲
Hadoop預設支援Gzip和BZip2的解壓縮方式,可直接讀取(hadoop fs -text指令),但hive隻能用TEXTFILE格式的表加載,然後再insertoverwrite 到其他格式的表(比如SEQUENCEFILE表),如果hive其他格式的表想要直接加載壓縮格式資料,需要重寫INPUTFORMAT和OUTPUTFORMAT檔案類
壓縮格式檔案的切分(不支援則hadoop不能并行的進行map操作)
BZip2和LZO(提供block級的壓縮)支援檔案切分
Gzip和Snappy則不支援。
hadoop中支援的壓縮格式
DEFLATEorg.apache.hadoop.io.compress.DefaultCodec
gzip org.apache.hadoop.io.compress.GzipCodec
bzip org.apache.hadoop.io.compress.BZip2Codec
Snappy org.apache.hadoop.io.compress.SnappyCodec
LZO:
org.apache.hadoop.io.compress.LzopCodec或者com.hadoop.compression.lzo.LzopCodec;
org.apache.hadoop.io.compress.LzoCodec或者com.hadoop.compression.lzo.LzoCodec;
注意:(引自http://ju.outofmemory.cn/entry/63512)
(1)org.apache.hadoop.io.compress.LzoCodec和com.hadoop.compression.lzo.LzoCodec功能一樣,都是源碼包中帶的,傳回都是lzo_deflate檔案
(2)有兩種壓縮編碼可用,即LzoCodec和LzopCodec,差別是:
1)LzoCodec比LzopCodec更快, LzopCodec為了相容LZOP程式添加了如 bytes signature, header等資訊
2)LzoCodec作為Reduce輸出,結果檔案擴充名為”.lzo_deflate”,無法被lzop讀取;
而使用LzopCodec作為Reduce輸出,生成擴充名為”.lzo”的檔案,可被lzop讀取
3)LzoCodec結果(.lzo_deflate檔案)不能由lzo index job的"DistributedLzoIndexer"建立index;且“.lzo_deflate”檔案不能作為MapReduce輸入(不識别,除非自編inputformat)。而所有這些“.LZO”檔案都支援
綜上所述,應該map輸出的中間結果使用LzoCodec,reduce輸出用 LzopCodec
===============================================================================
hive壓縮的編解碼器(壓縮格式)
執行set io.compression.codecs 可以檢視目前hive已加載的是以編解碼器(逗号分隔)
也就是說,參數io.compression.codecs是hadoop的MR讀寫支援的所有格式支援,如果設定,就必須設定所有支援格式。預設支援,沒有必要的話,最好别加。設定多個文法為:
setio.compression.codecs=org.apache.hadoop.io.compress.DefaultCodec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec;
當然,
set mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;
和
set mapred.output.compression.codec=org.apache.hadoop.io.compress.LzopCodec
兩者一樣,是LzopCodec的兩個不同開源包。用哪個都行。
hive壓縮設定
1)中間結果壓縮
中間結果是map産生的。格式設定語句
set hive.exec.compress.intermediate=true;
set hive.intermediate.compression.codec=org.apache.Hadoop.io.compress.LzoCodec;
map結果壓縮最好使用snappy的,因為壓縮的前提是map輸出非常大,影響io,如果中間結果資料集比較小反而會拖慢速度
另外,中間結果的壓縮格式設定還可以直接設定map輸出結果壓縮實作,如
set mapred.map.output.compression.codec=org.apache.Hadoop.io.compress.SnappyCodec
來代替set hive.intermediate.compression.codec這個語句實作
2)最終輸出結果壓縮
配置參數為hive.exec.compress.output
選擇編解碼器(壓縮格式)參數mapred.output.compression.code(
指令格式
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
(也可以用org.apache.hadoop.io.compress.SnappyCodec)
或者
set mapred.output.compress=true
setmapred.output.compression.codec=org.apache.hadoop.io.compress.LzopCodec
兩種方式功能一樣,之是以兩個方式,是因為作用不同的參數檔案
hive.exec.compress.output和mapred.output.compression.codec是hive-site.xml中的配置參數
而mapred.output.compress 和mapred.output.compression.codec 是hdfs-site.xml的配置參數
都可以配置實作。可以檢視各個檔案中的配置參數,如
hive-site.xml中有
<!--
<property>
<name>hive.exec.compress.output</name>
<value>true</value>
</property>
<property>
<name>mapred.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.GzipCodec</value>
</property>
-->
mapred-site.xml中有
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
</property>
<property>
<name>mapred.map.output.compression.codec</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
core-site.xml中有
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzopCodec</value>
</property>
hadoop-site.xml中有
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.LzoCodec</value>
<description>A listof the compression codec classes that can be used
for compression/decompression.</description>
</property>
<property>
<name>mapred.output.compress</name>
<value>true</value>
<description>Shouldthe job outputs be compressed?
</description>
</property>
<property>
<name>mapred.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.LzoCodec</value>
<description>If thejob outputs are compressed, how should they be compressed?
</description>
</property>
設定的另外方式:
hive –hiveconfhive.exec.compress.output=true –hiveconfmapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec
重要的輔助工作,添加索引
添加index是為讓.lzo檔案子在hdfs上按照block大小來切分塊(速度加快,但多消耗cpu時間。map數大量增加)
如果不建立lzo索引則不會按照block來切分塊
為每個lzo塊添加index的指令:
hadoop jar $HADOOP_HOME/lib/hadoop-lzo-0.4.15.jarcom.hadoop.compression.lzo.DistributedLzoIndexer path/xxx.lzo
注意(隻設定mapred.output.compress=true預設的reduce輸出格式為.lzo_deflate)
Hadoop上三種壓縮格式的存儲方案對比(LZO,gz,orc,)
Lzo的使用
drop table tmp_tb_test_lzo;
CREATE EXTERNAL TABLE tmp_tb_test_lzo( allstring)
stored as
INPUTFORMAT'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
OUTPUTFORMAT'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
location '/user/pmp_bi/test/testlog/'
---------------------------------------------
select
split(split(all,'\\|~\\|')[5],'/')[1]as media,
split(all,'\\|~\\|')[21] as device,
split(all,'\\|~\\|')[22] as network,
split(all,'\\|~\\|')[25] as id_code,
split(all,'\\|~\\|')[26] ascode_method,
split(all,'\\|~\\|')[30] as os,
split(all,'\\|~\\|')[34] as channel,
split(all,'\\|~\\|')[42] as adtype,
split(all,'\\|~\\|')[43] as rtbtype,
count(1) as cnt
from tmp_tb_test_lzo
group bysplit(split(all,'\\|~\\|')[5],'/')[1],split(all,'\\|~\\|')[21],split(all,'\\|~\\|')[22],split(all,'\\|~\\|')[25],split(all,'\\|~\\|')[26],split(all,'\\|~\\|')[30],split(all,'\\|~\\|')[34],split(all,'\\|~\\|')[42],split(all,'\\|~\\|')[43]
lzo加索引
hadoop jar/usr/local/hadoop-0.20.2/lib/hadoop-lzo-0.4.15.jarcom.hadoop.compression.lzo.LzoIndexer/user/pmp_bi/test/testlog/access_bid_20160414_22.log.lzo
ORC的使用
相關參數設定 ORC File Format:
https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties#ConfigurationProperties-ORCFileFormat
drop table test_tb_log_orc;
create table test_tb_log_orc ( all string )
stored as ORC;
預設為tblproperties("orc.compress"="ZLIB");
show create table test_tb_log_orc;
CREATE TABLE `test_tb_log_orc`(
`all` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
'hdfs://namenode/hivedata/warehouse/pmp.db/test_tb_log_orc'
TBLPROPERTIES (
'orc.compress'='ZLIB',
'transient_lastDdlTime'='1465283611')
-------------------------
desc formatted test_tb_log_orc;
# col_name data_type comment
all string
# Detailed Table Information
Database: pmp
Owner: pmp_bi
CreateTime: Tue Jun 07 13:48:19 CST 2016
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://namenode/hivedata/warehouse/pmp.db/test_tb_log_orc
Table Type: MANAGED_TABLE
Table Parameters:
transient_lastDdlTime 1465278499
# Storage Information
SerDe Library: org.apache.hadoop.hive.ql.io.orc.OrcSerde
InputFormat: org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
serialization.format 1
-------------------------
====================================================================
gz壓縮檔案hadoop處理
1) external tablefor gz
drop tabletmp_tb_test_gz;
CREATE EXTERNALTABLE tmp_tb_test_gz( all string )
location'/user/pmp_bi/test/testlog2/'
insert overwritetable test_tb_log_orc
select *
from tmp_tb_test_gz
time taken: 34分鐘
hadoop fs -ls/user/pmp_bi/test/testlog2
gz:4450965423
hadoop fs -ls/hivedata/warehouse/pmp.db/test_tb_log_orc
orc:4801158504
-------------------------------------------------------
2) load gz fromlocal(耗時同put到雲上建外部表)
hive直接load
drop tabletmp_tb_test_gz;
CREATE TABLEtmp_tb_test_gz( all string );
LOAD DATALOCAL INPATH '/home/pmp_bi/test/report_test/testlog2/rtb1_bid_20160606_15.log.gz'OVERWRITE INTO TABLE tmp_tb_test_gz;
timetaken:401 秒
insertoverwrite table test_tb_log_orc
select *
fromtmp_tb_test_gz
本地load是簡單的将gz檔案put到内部表路徑下/hivedata/warehouse/pmp.db/tmp_tb_test_gz/rtb1_bid_20160606_15.log.gz
同hadoop直接put耗時一樣
==================================================
gz本地解壓後put
1)hadoop fs -get/user/pmp_bi/test/testlog2/rtb1_bid_20160606_15.log.gz ./
time taken:1分鐘 15:53:39 to 15:54:45
size:4G
2)解壓
date
gzip -drtb1_bid_20160606_15.log.gz
date
time taken: 5分鐘(15:45:40to 15:50:51)
size:27117660098
3)
hadoop fs -mkdir/user/pmp_bi/test/testlog3
hadoop fs -ls/user/pmp_bi/test/testlog3
4)
date
hadoop fs -put./rtb1_bid_20160606_15.log /user/pmp_bi/test/testlog3/
date
time taken: 34分鐘(16:34:11to 17:08:23)
5)
drop tabletmp_tb_test_log_unzip;
CREATE EXTERNALTABLE tmp_tb_test_log_unzip( all string )
location'/user/pmp_bi/test/testlog3/'
insert overwritetable test_tb_log_orc
select *
fromtmp_tb_test_log_unzip
Time taken:69.458 seconds
------------------------------------------------------------------