hive學習之四:hive檔案格式以及壓縮編碼
1。檔案格式及壓縮編碼
當前hive版本支援的編碼型別:
set io.compression.codecs;
org.apache.hadoop.io.compress.GzipCodec,--壓縮後不可分割
org.apache.hadoop.io.compress.DefaultCodec,--預設
org.apache.hadoop.io.compress.SnappyCodec,--壓縮後不可分割
據說bzip2和lzo壓縮支援分割,我的hive版本里沒有(0.14)
預設的檔案格式是文字檔案(textfile,sequencefile,rcfile):
set hive.default.fileformat;
TextFile--預設
sequencefile--二進位制,可分割,有NONE,RECORD,BLOCK三種方式,一般BLOCK
rcfile--行列結合儲存方式,高效。建議使用。
看錶儲存的檔案格式,看建表語句:
hive>show create table sas_atpt;
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.SequenceFileInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat'
在輸出資訊的最後面可看出是SequenceFile
看其壓縮編碼格式:
hadoop fs -text /spdbccc/data/dest/SAS/SAS_ATPT/dt=20160506/000000_0|head -n 1;
16/05/18 10:01:34 INFO compress.CodecPool: Got brand-new decompressor [.snappy]
16/05/18 10:01:34 INFO compress.CodecPool: Got brand-new decompressor [.snappy]
16/05/18 10:01:34 INFO compress.CodecPool: Got brand-new decompressor [.snappy]
16/05/18 10:01:34 INFO compress.CodecPool: Got brand-new decompressor [.snappy]
16883528|C|6048|20160506|22531555|2167521675225315556048835429|156.0|4047398908347862|20160505|18.0|終止退費―分期折(分期寶)| ||0000|000|0.0
可看出是snappy壓縮編碼格式。如果沒有壓縮直接顯示內容。
看檔案記錄數:
hadoop fs -text /spdbccc/data/dest/SAS/SAS_ATPT/dt=20160506/000000_0|wc -l
--------------設定中間結果壓縮(map輸出壓縮)--------------
set hive.exec.compress.intermediate=true;
set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec
--------------最終輸出結果壓縮---------------------------
set hive.exec.compress.output=true;
set mapred.output.compression.type=BLOCK;---指定sequencefile壓縮方式
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
3。相同壓縮編碼不同檔案格式測試
表名:sas_amed_req
snappy壓縮編碼,sequencefile
資料量:22003205
大小:2.1 G
create table sas_amed_rc like sas_amed;
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
alter table sas_amed_rc set fileformat rcfile;
insert overwrite table sas_amed_rc partition(dt) select * from sas_amed where dt='20160407';
資料量不變,大小變為1.7G。
查詢效能測試:測試sql:
select ED_CUST_NBR,
ED_ACCT_NBR,
ED_CARD_NBR,
ED_APPLICATION_ID,
ED_LOGO,
ED_DATE_FIRST_CARD_VERIFY,
ED_CDFRM
--row_number() over (distribute by ED_APPLICATION_ID sort by ED_CARD_SEQ desc) rank ------1
from sas_amed_rc
where dt='20160407' and ED_PRIMARY_CARD_IND='1' limit 100;
Time taken: 43.229 seconds, Fetched: 100 row(s)
更換上述sql的表名為sas_amed_rc,結果為:
Time taken: 43.465 seconds, Fetched: 100 row(s)
預測是rcfile查詢更快,但是沒什麼差別。將1處註釋掉查詢,rcfile比sequencefile快了4秒左右。再測試join速度
select a.* from
(select ED_CUST_NBR,
ED_ACCT_NBR,
ED_CARD_NBR,
ED_APPLICATION_ID,
ED_LOGO,
ED_DATE_FIRST_CARD_VERIFY,
ED_CDFRM
from sas_amed
where dt='20160407' and ED_PRIMARY_CARD_IND='1') a inner join (select * from sas_nasrdwn where dt='20160407') b
on a.ED_APPLICATION_ID=b.NASRDW_APPL_ID;
rcfile+snappycodec:Time taken: 32.476 seconds, Fetched: 42011 row(s)
seqfile+snappycodec:Time taken: 35.36 seconds, Fetched: 42011 row(s)
確實快了不少。從這點上來看,rcfile在查詢時候的優勢還是比sequencefile高的。
3。不同壓縮編碼相同檔案格式測試
檔案格式:rcfile 測試這2個不同的編碼:default,snappy,default壓縮後1.2個G,壓縮率高於snappy,gzip壓縮後930.7M,壓縮比最高。
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException:
java.lang.IllegalArgumentException: Compression codec org.apache.hadoop.io.compress.org.apache.hadoop.io.compress.GzipCodec was not found.
select a.* from
(select ED_CUST_NBR,
ED_ACCT_NBR,
ED_CARD_NBR,
ED_APPLICATION_ID,
ED_LOGO,
ED_DATE_FIRST_CARD_VERIFY,
ED_CDFRM
from sas_amed_rc_gzip
where dt='20160407' and ED_PRIMARY_CARD_IND='1') a inner join (select * from sas_nasrdwn where dt='20160407') b
on a.ED_APPLICATION_ID=b.NASRDW_APPL_ID;
rcfile+defaultcodec:Time taken: 91.915 seconds, Fetched: 42011 row(s)
rcfile+snappycodec:Time taken: 38.182 seconds, Fetched: 42011 row(s)
rcfile+gzipcodec:Time taken: 39.558 seconds, Fetched: 42011 row(s)
綜上所述選擇rcfile+snappycodec檔案格式和壓縮編碼優於其他。建議採用這種組合方式。
當前hive版本支援的編碼型別:
set io.compression.codecs;
org.apache.hadoop.io.compress.GzipCodec,--壓縮後不可分割
org.apache.hadoop.io.compress.DefaultCodec,--預設
org.apache.hadoop.io.compress.SnappyCodec,--壓縮後不可分割
據說bzip2和lzo壓縮支援分割,我的hive版本里沒有(0.14)
預設的檔案格式是文字檔案(textfile,sequencefile,rcfile):
set hive.default.fileformat;
TextFile--預設
sequencefile--二進位制,可分割,有NONE,RECORD,BLOCK三種方式,一般BLOCK
rcfile--行列結合儲存方式,高效。建議使用。
看錶儲存的檔案格式,看建表語句:
hive>show create table sas_atpt;
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.SequenceFileInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat'
在輸出資訊的最後面可看出是SequenceFile
看其壓縮編碼格式:
hadoop fs -text /spdbccc/data/dest/SAS/SAS_ATPT/dt=20160506/000000_0|head -n 1;
16/05/18 10:01:34 INFO compress.CodecPool: Got brand-new decompressor [.snappy]
16/05/18 10:01:34 INFO compress.CodecPool: Got brand-new decompressor [.snappy]
16/05/18 10:01:34 INFO compress.CodecPool: Got brand-new decompressor [.snappy]
16/05/18 10:01:34 INFO compress.CodecPool: Got brand-new decompressor [.snappy]
16883528|C|6048|20160506|22531555|2167521675225315556048835429|156.0|4047398908347862|20160505|18.0|終止退費―分期折(分期寶)| ||0000|000|0.0
可看出是snappy壓縮編碼格式。如果沒有壓縮直接顯示內容。
看檔案記錄數:
hadoop fs -text /spdbccc/data/dest/SAS/SAS_ATPT/dt=20160506/000000_0|wc -l
--------------設定中間結果壓縮(map輸出壓縮)--------------
set hive.exec.compress.intermediate=true;
set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec
--------------最終輸出結果壓縮---------------------------
set hive.exec.compress.output=true;
set mapred.output.compression.type=BLOCK;---指定sequencefile壓縮方式
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
3。相同壓縮編碼不同檔案格式測試
表名:sas_amed_req
snappy壓縮編碼,sequencefile
資料量:22003205
大小:2.1 G
create table sas_amed_rc like sas_amed;
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
alter table sas_amed_rc set fileformat rcfile;
insert overwrite table sas_amed_rc partition(dt) select * from sas_amed where dt='20160407';
資料量不變,大小變為1.7G。
查詢效能測試:測試sql:
select ED_CUST_NBR,
ED_ACCT_NBR,
ED_CARD_NBR,
ED_APPLICATION_ID,
ED_LOGO,
ED_DATE_FIRST_CARD_VERIFY,
ED_CDFRM
--row_number() over (distribute by ED_APPLICATION_ID sort by ED_CARD_SEQ desc) rank ------1
from sas_amed_rc
where dt='20160407' and ED_PRIMARY_CARD_IND='1' limit 100;
Time taken: 43.229 seconds, Fetched: 100 row(s)
更換上述sql的表名為sas_amed_rc,結果為:
Time taken: 43.465 seconds, Fetched: 100 row(s)
預測是rcfile查詢更快,但是沒什麼差別。將1處註釋掉查詢,rcfile比sequencefile快了4秒左右。再測試join速度
select a.* from
(select ED_CUST_NBR,
ED_ACCT_NBR,
ED_CARD_NBR,
ED_APPLICATION_ID,
ED_LOGO,
ED_DATE_FIRST_CARD_VERIFY,
ED_CDFRM
from sas_amed
where dt='20160407' and ED_PRIMARY_CARD_IND='1') a inner join (select * from sas_nasrdwn where dt='20160407') b
on a.ED_APPLICATION_ID=b.NASRDW_APPL_ID;
rcfile+snappycodec:Time taken: 32.476 seconds, Fetched: 42011 row(s)
seqfile+snappycodec:Time taken: 35.36 seconds, Fetched: 42011 row(s)
確實快了不少。從這點上來看,rcfile在查詢時候的優勢還是比sequencefile高的。
3。不同壓縮編碼相同檔案格式測試
檔案格式:rcfile 測試這2個不同的編碼:default,snappy,default壓縮後1.2個G,壓縮率高於snappy,gzip壓縮後930.7M,壓縮比最高。
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException:
java.lang.IllegalArgumentException: Compression codec org.apache.hadoop.io.compress.org.apache.hadoop.io.compress.GzipCodec was not found.
select a.* from
(select ED_CUST_NBR,
ED_ACCT_NBR,
ED_CARD_NBR,
ED_APPLICATION_ID,
ED_LOGO,
ED_DATE_FIRST_CARD_VERIFY,
ED_CDFRM
from sas_amed_rc_gzip
where dt='20160407' and ED_PRIMARY_CARD_IND='1') a inner join (select * from sas_nasrdwn where dt='20160407') b
on a.ED_APPLICATION_ID=b.NASRDW_APPL_ID;
rcfile+defaultcodec:Time taken: 91.915 seconds, Fetched: 42011 row(s)
rcfile+snappycodec:Time taken: 38.182 seconds, Fetched: 42011 row(s)
rcfile+gzipcodec:Time taken: 39.558 seconds, Fetched: 42011 row(s)
綜上所述選擇rcfile+snappycodec檔案格式和壓縮編碼優於其他。建議採用這種組合方式。
4。判斷是否資料傾斜
1.1.如果任務卡在reduce階段不動或者執行非常緩慢,在排除其他情況下大致可認為出現了資料傾斜(hive sql中出現的join,group by,distinct等情況都有可能)。
1.2.任務執行完成,但是耗費的時間過長,從YARN或者MR的監控頁面上看job執行的各個reduce數的耗時情況。例如某個job10個map,20個reduce。map大約20秒左右完成,reduce基本在10秒
左右完成,但某一個需要3分鐘完成,可基本判斷出現了資料傾斜。
1.1.如果任務卡在reduce階段不動或者執行非常緩慢,在排除其他情況下大致可認為出現了資料傾斜(hive sql中出現的join,group by,distinct等情況都有可能)。
1.2.任務執行完成,但是耗費的時間過長,從YARN或者MR的監控頁面上看job執行的各個reduce數的耗時情況。例如某個job10個map,20個reduce。map大約20秒左右完成,reduce基本在10秒
左右完成,但某一個需要3分鐘完成,可基本判斷出現了資料傾斜。
其本質原因:是某個key過於集中(包括空值過多),分佈不均勻造成的,解決方法在優化篇中有。
5。設定hive作業執行的佇列;
set mapreduce.job.queuename=hive(佇列名稱)
相關文章
- Java學習筆記之I/O流(讀取壓縮檔案以及壓縮檔案)Java筆記
- hive檔案儲存格式Hive
- Hive學習之Hive的安裝Hive
- Hive學習之六 《Hive進階— —hive jdbc》 詳解HiveJDBC
- HIVE學習之(三)Hive
- hive學習筆記之四:分割槽表Hive筆記
- Hive之儲存格式Hive
- Hive學習之基本操作Hive
- Hive學習Hive
- Hive 學習Hive
- Hive學習之JDBC訪問HiveJDBC
- hive學習之一:認識hiveHive
- Hive學習之五 《Hive進階—UDF操作案例》 詳解Hive
- PE檔案格式詳細解析(四)-- 執行時壓縮及UPX壓縮除錯除錯
- hive學習之三:專案中的hive優化實踐Hive優化
- hive學習筆記之十一:UDTFHive筆記
- Hive學習之常用互動命令Hive
- Hive學習之型別轉化Hive型別
- java 生成 zip格式 壓縮檔案Java
- hive迷案之消失的分割槽檔案Hive
- hive檔案數限制Hive
- HIVE基本語法以及HIVE分割槽Hive
- Hive之 hive架構Hive架構
- HTTP 之 檔案壓縮HTTP
- hive學習筆記Hive筆記
- Hive的壓縮儲存和簡單優化Hive優化
- Java實現檔案壓縮與解壓[zip格式,gzip格式]Java
- hive學習筆記之五:分桶Hive筆記
- hive學習筆記之八:SqoopHive筆記OOP
- Hive學習之常見屬性配置Hive
- Hive學習之更改表的屬性Hive
- Hive學習之二 《Hive的安裝之自定義mysql資料庫》HiveMySql資料庫
- Hive學習筆記 1 Hive體系結構Hive筆記
- Hive學習筆記 6 Hive的JDBC連線Hive筆記JDBC
- Hive學習之四 《Hive分割槽表場景案例應用案例,企業日誌載入》 詳解Hive
- 23 大資料之hive(第四部 hive基礎)大資料Hive
- Hive小檔案合併Hive
- [hive]hive資料模型中四種表Hive模型