目錄
(1)壓縮概述
(2)開啟Map輸出階段壓縮
(3)開啟Reduce輸出階段壓縮
(4)建立表時指定壓縮格式
(1)壓縮概述
MR支援的壓縮編碼,表1
為了支援多種壓縮/解壓縮算法,Hadoop引入了編碼/解碼器,表2
壓縮性能的比較,表3
注:表1,表2,表3來自網絡。
假如有一個表:
create table emp_t(
id int,
name String,
deptno int)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
stored as textfile;
(2)開啟Map輸出階段壓縮
開啟map輸出階段壓縮可以減少job中Map和Reduce task間資料傳輸量。具體配置如下:
案例實操:
開啟hive中間傳輸資料壓縮功能
set hive.exec.compress.intermediate=true;
開啟mapreduce中map輸出壓縮功能
set mapreduce.map.output.compress=true;
設定mapreduce中map輸出資料的壓縮方式
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
執行查詢語句
select count(1) as name from emp_t;
(3)開啟Reduce輸出階段壓縮
當Hive将輸出寫入到表中時,輸出内容同樣可以進行壓縮。屬性hive.exec.compress.output控制着這個功能。使用者可能需要保持預設設定檔案中的預設值false,這樣預設的輸出就是非壓縮的純文字檔案了。使用者可以通過在查詢語句或執行腳本中設定這個值為true,來開啟輸出結果壓縮功能。
案例實操:
開啟hive最終輸出資料壓縮功能,預設false
set hive.exec.compress.output=true;
開啟mapreduce最終輸出資料壓縮,預設false
set mapreduce.output.fileoutputformat.compress=true;
設定mapreduce最終資料輸出壓縮方式,
預設:mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.DeflateCodec
set mapreduce.output.fileoutputformat.compress.codec =org.apache.hadoop.io.compress.SnappyCodec
設定mapreduce最終資料輸出壓縮為塊壓縮(NONE 、RECORD、BLOCK)
set mapreduce.output.fileoutputformat.compress.type=BLOCK;
剛建立表時,hdfs中沒有檔案
插入資料後插入資料,檔案格式為snappy:
insert into emp_t(id,name,deptno)values(1,'zhangsan',1);
關閉mapreduce壓縮後插入資料,檔案格式為textfile:
insert into emp_t(id,name,deptno)values(2,'zhangsan',1);
(4)建立表時指定壓縮格式
建立表時指定壓縮格式和通過設定Reduce輸出階段壓縮的功能一樣。
create table emp_t1(
id int,
name String,
deptno int)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
STORED AS orc tblproperties ("orc.compress"="Snappy");
插入資料:
insert into emp_t1(id,name,deptno)values(2,'zhangsan',1);
檢視HDFS的檔案: