打工人必備:Hive小文件合并與數(shù)據(jù)壓縮
點擊上方藍色字體,選擇“設(shè)為星標”

Hive倉庫表數(shù)據(jù)最終是存儲在HDFS上,由于Hadoop的特性,對大文件的處理非常高效。而且大文件可以減少文件元數(shù)據(jù)信息,減輕NameNode的存儲壓力。但是在數(shù)據(jù)倉庫中,越是上層的表匯總程度就越高,數(shù)據(jù)量也就越小,而且這些表通常會有日期分區(qū),隨著時間的推移,HDFS的文件數(shù)目就會逐步增加。
一、小文件帶來的問題
HDFS的文件包好數(shù)據(jù)塊和元信息,其中元信息包括位置、大小、分塊等信息,都保存在NameNode的內(nèi)存中。每個對象大約占用150個字節(jié),因此一千萬文件及分塊就會占用約3G的內(nèi)存空間,一旦接近這個量級,NameNode的性能就會開始下降。HDFS讀寫小文件時也會更加耗時,因為每次都需要從NameNode獲取元信息,并且對應(yīng)的DataNode建立連接。對于MapReduce程序來說,小文件會增加Mapper的數(shù)量,每個Map任務(wù)只會處理很少的數(shù)據(jù),浪費大量的調(diào)度時間。
二、Hive小文件產(chǎn)生的原因
一方面hive數(shù)據(jù)倉庫中匯總表的數(shù)據(jù)量通常比源數(shù)據(jù)少的多,而且為了提升運算速度,我們會增加Reduce的數(shù)量,Hive本身也會做類似的優(yōu)化----Reducer數(shù)量等于源數(shù)據(jù)的量除以hive.exec.reducers.bytes.per.reduce所配置的量(默認1G)。Reduce數(shù)量的增加也即意味著結(jié)果文件的增加,從而產(chǎn)生小文件的問題。
解決小文件的問題可以從兩個方向入手:
?輸入合并。即在map前合并小文件。?輸出合并。即在輸出結(jié)果的時候合并小文件。
三、配置Map輸入合并
-- 每個Map最大輸入大小,決定合并后的文件數(shù)
set mapred.max.split.size=256000000;
-- 一個節(jié)點上split的至少的大小 ,決定了多個data node上的文件是否需要合并
set mapred.min.split.size.per.node=100000000;
-- 一個交換機下split的至少的大小,決定了多個交換機上的文件是否需要合并
set mapred.min.split.size.per.rack=100000000;
-- 執(zhí)行Map前進行小文件合并
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
四、配置hive結(jié)果合并
通過設(shè)置hive的配置項在執(zhí)行結(jié)束后對結(jié)果文件進行合并:
set hive.merge.mapfiles = true #在Map-only的任務(wù)結(jié)束時合并小文件
set hive.merge.mapredfiles = true #在Map-Reduce的任務(wù)結(jié)束時合并小文件
set hive.merge.size.per.task = 256*1000*1000 #合并文件的大小
set hive.merge.smallfiles.avgsize=16000000 #當輸出文件的平均大小小于該值時,啟動一個獨立的map-reduce任務(wù)進行文件merge
hive在對結(jié)果文件進行合并時會執(zhí)行一個額外的map-only腳本,mapper的數(shù)量是文件總大小除以size.per.task參數(shù)所得的值,觸發(fā)合并的條件是:根據(jù)查詢類型不同,相應(yīng)的mapfiles/mapredfiles參數(shù)需要打開;結(jié)果文件的平均大小需要大于avgsize參數(shù)的值。
-- map-red job,5個reducer,產(chǎn)生5個60K的文件。
create table dw_stage.zj_small as
select paid, count (*)
from dw_db.dw_soj_imp_dtl
where log_dt = '2014-04-14'
group by paid;
-- 執(zhí)行額外的map-only job,一個mapper,產(chǎn)生一個300K的文件。
set hive.merge.mapredfiles= true;
create table dw_stage.zj_small as
select paid, count (*)
from dw_db.dw_soj_imp_dtl
where log_dt = '2014-04-14'
group by paid;
-- map-only job,45個mapper,產(chǎn)生45個25M左右的文件。
create table dw_stage.zj_small as
select *
from dw_db.dw_soj_imp_dtl
where log_dt = '2014-04-14'
and paid like '%baidu%' ;
-- 執(zhí)行額外的map-only job,4個mapper,產(chǎn)生4個250M左右的文件。
set hive.merge.smallfiles.avgsize=100000000;
create table dw_stage.zj_small as
select *
from dw_db.dw_soj_imp_dtl
where log_dt = '2014-04-14'
and paid like '%baidu%' ;
五、壓縮文件的處理
對于輸出結(jié)果為壓縮文件形式存儲的情況,要解決小文件問題,如果在map輸入前合并,對輸出的文件存儲格式并沒有限制。但是如果使用輸出合并,則必須配合SequenceFile來存儲,否則無法進行合并,以下是實例:
set mapred.output.compression.type=BLOCK;
set hive.exec.compress.output= true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.LzoCodec;
set hive.merge.smallfiles.avgsize=100000000;
drop table if exists dw_stage.zj_small;
create table dw_stage.zj_small
STORED AS SEQUENCEFILE
as select *
from dw_db.dw_soj_imp_dtl
where log_dt = '2014-04-14'
and paid like '%baidu%' ;
六、使用HAR歸檔文件
Hadoop的歸檔文件格式也是解決小文件問題的方式之一。而且hive提供了原生支持:
set hive.archive.enabled= true;
set hive.archive.har.parentdir.settable= true;
set har.partfile.size=1099511627776;
ALTER TABLE srcpart ARCHIVE PARTITION(ds= '2008-04-08', hr= '12' );
ALTER TABLE srcpart UNARCHIVE PARTITION(ds= '2008-04-08', hr= '12' );
如果使用的不是分區(qū)表,則可以創(chuàng)建成外部表,并使用har://協(xié)議來指定路徑。
文件壓縮
數(shù)據(jù)倉庫在建設(shè)使用的過程中,主要消耗的資源包含:CPU、MEMORY、DISK三部分。
數(shù)據(jù)倉庫在計算過程中主要消耗CPU和Memory資源,當然也會消耗一些DISK資源用來存儲計算過程中的臨時結(jié)果。但是主要優(yōu)化的方向,還是降低CPU和MEMORY的消耗,這方面主要依賴于模型設(shè)計的合理性,所以在模型設(shè)計階段增加模型設(shè)計review的步驟,保證模型設(shè)計的合理性。
數(shù)據(jù)倉庫在數(shù)據(jù)的存儲階段主要消耗MEMORY和DISK資源。memory資源主要是在NameNode存儲文件信息的時候消耗掉;DISK在存儲數(shù)據(jù)的時候消耗掉。在這個階段需要嚴格控制HIVE表的的定義,來降低資源的消耗。
本次主要探討是數(shù)據(jù)倉庫在數(shù)據(jù)存儲階段對資源消耗的優(yōu)化,下面將通過2個方面展開,分別是:數(shù)據(jù)倉庫如何配置,可以實現(xiàn)數(shù)據(jù)壓縮,降低數(shù)據(jù)的存儲量,達到減少對DISK的消耗;數(shù)倉表如何設(shè)計,可以降低文件信息存儲量,達到減少對MEMORY的消耗。
hive在存儲數(shù)據(jù)時支持通過不同的文件類型來組織,并且為了節(jié)省相應(yīng)的存儲資源,也提供了多種類型的壓縮算法,供用戶選擇。只要是配置正確的文件類型和壓縮類型,hive都可以按預(yù)期讀取并解析數(shù)據(jù),不影響上層HQL語句的使用。例如:SequenceFile本身的結(jié)構(gòu)已經(jīng)設(shè)計了對內(nèi)容進行壓縮,所以對于SequenceFile文件的壓縮,并不是先生成SequenceFile文件,再對文件進行壓縮;而是生成SequenceFile文件時,就對其中的內(nèi)容字段進行壓縮。最終壓縮后,對外仍然體現(xiàn)為一個SequenceFile。RCFile、ORCFile、Parquet、Avro對于壓縮的處理方式與SequenceFile相同。
hive支持的文件類型有:TextFile、SequenceFile、RCFile、ORCFile、Parquet、Avro。
hive支持的壓縮算法有:

TextFile
TextFile是hive數(shù)據(jù)表的默認格式,存儲方式:行存儲;可以采用多種壓縮方式,但是部分壓縮算法壓縮數(shù)據(jù)后生成的文件是不支持split;壓縮后的數(shù)據(jù)在反序列化過程中,必須逐個字段判斷是不是分隔符和行結(jié)束符,因此反序列化開銷會比SequenceFile高幾十倍。
?TextFile文件,非壓縮
--創(chuàng)建一個表,格式為文本文件:
CREATE EXTERNAL TABLE student_text (id STRING, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
--導(dǎo)入數(shù)據(jù)到此表中,將啟動MR任務(wù)
INSERT OVERWRITE TABLE student_text SELECT * FROM student;
可以看到生成的數(shù)據(jù)文件的格式為非壓縮的文本文件:
hdfs dfs -cat /user/hive/warehouse/student_text/000000_0
1001810081,cheyo
1001810082,pku
1001810083,rocky
1001810084,stephen
2002820081,sql
2002820082,hello
2002820083,hijj
3001810081,hhhhhhh
3001810082,abbbbbb
?TextFile文件,Deflate壓縮
--創(chuàng)建一個表,格式為文件文件:
CREATE TABLE student_text_def (id STRING, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
--設(shè)置壓縮類型為Gzip壓縮
SET hive.exec.compress.output=true;
SET mapred.output.compress=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.DefaultCodec;
--導(dǎo)入數(shù)據(jù):
INSERT OVERWRITE TABLE student_text_def SELECT * FROM student;
--查看數(shù)據(jù)
SELECT * FROM student_text_def;
查看數(shù)據(jù)文件,可以看到數(shù)據(jù)文件為多個.deflate文件
hdfs dfs -ls /user/hive/warehouse/student_text_def/
-rw-r--r-- 2015-09-16 12:48 /user/hive/warehouse/student_text_def/000000_0.deflate
-rw-r--r-- 2015-09-16 12:48 /user/hive/warehouse/student_text_def/000001_0.deflate
-rw-r--r-- 2015-09-16 12:48 /user/hive/warehouse/student_text_def/000002_0.deflate
?TextFile文件,Gzip壓縮
--創(chuàng)建一個表,格式為文件文件:
CREATE TABLE student_text_gzip (id STRING, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
--設(shè)置壓縮類型為Gzip壓縮
SET hive.exec.compress.output=true;
SET mapred.output.compress=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
--導(dǎo)入數(shù)據(jù):
INSERT OVERWRITE TABLE student_text_gzip SELECT * FROM student;
--查看數(shù)據(jù)
SELECT * FROM student_text_gzip;
查看數(shù)據(jù)文件,可以看到數(shù)據(jù)文件為多個.gz文件。解壓.gz文件,可以看到明文文本:
hdfs dfs -ls /user/hive/warehouse/student_text_gzip/
-rw-r--r-- 2015-09-15 10:03 /user/hive/warehouse/student_text_gzip/000000_0.gz
-rw-r--r-- 2015-09-15 10:03 /user/hive/warehouse/student_text_gzip/000001_0.gz
-rw-r--r-- 2015-09-15 10:03 /user/hive/warehouse/student_text_gzip/000002_0.gz
?TextFile文件,Bzip2壓縮
--創(chuàng)建一個表,格式為文件文件:
CREATE TABLE student_text_bzip2 (id STRING, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
--設(shè)置壓縮類型為Bzip2壓縮:
SET hive.exec.compress.output=true;
SET mapred.output.compress=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec;
--導(dǎo)入數(shù)據(jù)
INSERT OVERWRITE TABLE student_text_bzip2 SELECT * FROM student;
--查看數(shù)據(jù):
SELECT * FROM student_text_bzip2;
查看數(shù)據(jù)文件,可看到數(shù)據(jù)文件為多個.bz2文件。解開.bz2文件,可以看到明文文本:
hdfs dfs -ls /user/hive/warehouse/student_text_bzip2
-rw-r--r-- 2015-09-15 10:09 /user/hive/warehouse/student_text_bzip2/000000_0.bz2
-rw-r--r-- 2015-09-15 10:09 /user/hive/warehouse/student_text_bzip2/000001_0.bz2
-rw-r--r-- 2015-09-15 10:09 /user/hive/warehouse/student_text_bzip2/000002_0.bz2
?TextFile文件,Lzo壓縮
--創(chuàng)建表
CREATE TABLE student_text_lzo (id STRING, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
--設(shè)置為LZO壓縮
SET hive.exec.compress.output=true;
SET mapred.output.compress=true;
SET mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;
--導(dǎo)入數(shù)據(jù)
INSERT OVERWRITE TABLE student_text_lzo SELECT * FROM student;
--查詢數(shù)據(jù)
SELECT * FROM student_text_lzo;
查看數(shù)據(jù)文件,可以看到數(shù)據(jù)文件為多個.lzo壓縮。解開.lzo文件,可以看到明文文件。(需要安裝lzop庫)
?TextFile文件,Lz4壓縮
--創(chuàng)建表
CREATE TABLE student_text_lz4 (id STRING, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
--設(shè)置為LZ4壓縮
SET hive.exec.compress.output=true;
SET mapred.output.compress=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.Lz4Codec;
--導(dǎo)入數(shù)據(jù)
INSERT OVERWRITE TABLE student_text_lz4 SELECT * FROM student;
查看數(shù)據(jù)文件,可看到數(shù)據(jù)文件為多個.lz4壓縮。使用cat查看.lz4文件,可以看到是壓縮后的文本。
hdfs dfs -ls /user/hive/warehouse/student_text_lz4
-rw-r--r-- 2015-09-16 12:06 /user/hive/warehouse/student_text_lz4/000000_0.lz4
-rw-r--r-- 2015-09-16 12:06 /user/hive/warehouse/student_text_lz4/000001_0.lz4
-rw-r--r-- 2015-09-16 12:06 /user/hive/warehouse/student_text_lz4/000002_0.lz4
?TextFile文件,Snappy壓縮
--創(chuàng)建表
CREATE TABLE student_text_snappy (id STRING, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
--設(shè)置壓縮
SET hive.exec.compress.output=true;
SET mapred.compress.map.output=true;
SET mapred.output.compress=true;
SET mapred.output.compression=org.apache.hadoop.io.compress.SnappyCodec;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
SET io.compression.codecs=org.apache.hadoop.io.compress.SnappyCodec;
--導(dǎo)入數(shù)據(jù)
INSERT OVERWRITE TABLE student_text_snappy SELECT * FROM student;
--查詢數(shù)據(jù)
SELECT * FROM student_text_snappy;
查看數(shù)據(jù)文件,可看到數(shù)據(jù)文件多個.snappy壓縮文件。使用cat查看.snappy文件,可以看到是壓縮后的文本:
hdfs dfs -ls /user/hive/warehouse/student_text_snappy
Found 3 items
-rw-r--r-- 2015-09-15 16:42 /user/hive/warehouse/student_text_snappy/000000_0.snappy
-rw-r--r-- 2015-09-15 16:42 /user/hive/warehouse/student_text_snappy/000001_0.snappy
-rw-r--r-- 2015-09-15 16:42 /user/hive/warehouse/student_text_snappy/000002_0.snappy
SequenceFile文件
SequenceFile是Hadoop API提供的一種二進制文件,它將數(shù)據(jù)以
?SequenceFile是一種二進制文件,以
?SequenceFile,Deflate壓縮
--創(chuàng)建一個表,格式為文件文件:
CREATE TABLE student_seq_def (id STRING, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS SEQUENCEFILE;
--設(shè)置壓縮算法為Deflate壓縮
SET hive.exec.compress.output=true;
SET mapred.output.compress=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.DeflateCodec;
--設(shè)置壓縮類型為block
SET mapred.output.compression.type=BLOCK
--導(dǎo)入數(shù)據(jù):
INSERT OVERWRITE TABLE student_seq_def SELECT * FROM student;
--查看數(shù)據(jù)
SELECT * FROM student_seq_def;
查看數(shù)據(jù)文件,是一個密文的文件。
hdfs dfs -ls /user/hive/warehouse/student_seq_def/
-rw-r--r-- /user/hive/warehouse/student_seq_def/000000_0
?SequenceFile,Gzip壓縮
--創(chuàng)建一個表,格式為文件文件:
CREATE TABLE student_seq_gzip (id STRING, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS SEQUENCEFILE;
--設(shè)置壓縮類型為Gzip壓縮
SET hive.exec.compress.output=true;
SET mapred.output.compress=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
--設(shè)置壓縮類型為block
SET mapred.output.compression.type=BLOCK
--導(dǎo)入數(shù)據(jù):
INSERT OVERWRITE TABLE student_seq_gzip SELECT * FROM student;
--查看數(shù)據(jù)
SELECT * FROM student_seq_gzip;
查看數(shù)據(jù)文件,是一個密文的文件,無法通過gzip解壓:
hdfs dfs -ls /user/hive/warehouse/student_seq_gzip/
-rw-r--r-- /user/hive/warehouse/student_seq_gzip/000000_0
RcFile
存儲方式:數(shù)據(jù)按行分塊,每塊按列存儲。結(jié)合了行存儲和列存儲的有點:
?首先RCFile保證同一行的數(shù)據(jù)位于同一節(jié)點,因此元組重構(gòu)開銷很低;?其次像列存儲一樣,RCFile能夠利用列維度的數(shù)據(jù)壓縮,并且能跳過不必要的列讀取。
RCFile的一個行組包括三部分:
?第一部分是行組頭部的同步標識,主要用于分割HDFS塊中的兩個連續(xù)行組;?第二部分是行組的元數(shù)據(jù)頭部,用戶存儲行組單元的信息,包括行組中的記錄數(shù)、每個列的字節(jié)數(shù)、列中每個域的字節(jié)數(shù);?第三部分是表格數(shù)據(jù)段,即實際的列存儲數(shù)據(jù)。在該部分中,同一列的所有域順序存儲。
數(shù)據(jù)追加:RCFile不支持任意方式的數(shù)據(jù)寫操作,僅提供一種追加接口,這是因為底層的HDFS當前僅僅支持數(shù)據(jù)追加寫文件尾部。
行組大小:行組變大有助于提高數(shù)據(jù)壓縮的效率,但是可能會損害數(shù)據(jù)的讀取性能,因為這樣增加了 Lazy 解壓性能的消耗。而且行組變大會占用更多的內(nèi)存,這會影響并發(fā)執(zhí)行的其他MR作業(yè)。考慮到存儲空間和查詢效率兩個方面,F(xiàn)acebook 選擇 4MB 作為默認的行組大小,當然也允許用戶自行選擇參數(shù)進行配置。
?RcFile,Gzip壓縮
CREATE TABLE student_rcfile_gzip (id STRING, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS RCFILE;
--設(shè)置壓縮類型為Gzip壓縮
SET hive.exec.compress.output=true;
SET mapred.output.compress=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
SET io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
--導(dǎo)入數(shù)據(jù):
INSERT OVERWRITE TABLE student_rcfile_gzip SELECT id,name FROM student;
--查看數(shù)據(jù)
SELECT * FROM student_rcfile_gzip;
ORCFile
ORCFile有自己的參數(shù)設(shè)置壓縮格式,一般不使用上述Hive參數(shù)設(shè)置壓縮參數(shù)。
?存儲方式:數(shù)據(jù)按行分塊,每塊按照列存儲;?壓縮快 快速列存取?效率比RCFile高,是RCFile的改良版本。
?ORCFile,Zlib壓縮
--創(chuàng)建表
CREATE TABLE student_orcfile_zlib (id STRING, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS ORCFILE TBLPROPERTIES ("orc.compress"="ZLIB");
--導(dǎo)入數(shù)據(jù)
INSERT OVERWRITE TABLE student_orcfile_zlib SELECT id,name FROM student;
--查詢數(shù)據(jù)
SELECT * FROM student_orcfile_zlib;
?ORCFile,Snappy壓縮
--創(chuàng)建表
CREATE TABLE student_orcfile_snappy2 (id STRING, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS ORCFILE TBLPROPERTIES ("orc.compress"="SNAPPY");
--導(dǎo)入數(shù)據(jù)
INSERT OVERWRITE TABLE student_orcfile_snappy2 SELECT id,name FROM student;
--查詢數(shù)據(jù)
SELECT * FROM student_orcfile_snappy2;
?不推薦
一般不推薦使用下述方式。采用下述方式壓縮后,結(jié)果與上面同類型壓縮(Snappy)不同。
--創(chuàng)建表
CREATE TABLE student_orcfile_snappy (id STRING, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS ORCFILE;
--設(shè)置壓縮
SET hive.exec.compress.output=true;
SET mapred.compress.map.output=true;
SET mapred.output.compress=true;
SET mapred.output.compression=org.apache.hadoop.io.compress.SnappyCodec;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
SET io.compression.codecs=org.apache.hadoop.io.compress.SnappyCodec;
--導(dǎo)入數(shù)據(jù)
INSERT OVERWRITE TABLE student_orcfile_snappy SELECT id,name FROM student;
--查詢數(shù)據(jù)
SELECT * FROM student_orcfile_snappy;
Parquet
?Parquet,Snappy壓縮
--創(chuàng)建表
CREATE TABLE student_parquet_snappy (id STRING, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS PARQUET;
--設(shè)置壓縮
SET hive.exec.compress.output=true;
SET mapred.compress.map.output=true;
SET mapred.output.compress=true;
SET mapred.output.compression=org.apache.hadoop.io.compress.SnappyCodec;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
SET io.compression.codecs=org.apache.hadoop.io.compress.SnappyCodec;
--導(dǎo)入數(shù)據(jù)
INSERT OVERWRITE TABLE student_parquet_snappy SELECT id,name FROM student;
--查詢數(shù)據(jù)
SELECT * FROM student_parquet_snappy;
Avro
?Avro,Snappy壓縮
--創(chuàng)建表
CREATE TABLE student_avro_snappy (id STRING, name STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS AVRO;
--設(shè)置壓縮
SET hive.exec.compress.output=true;
SET mapred.compress.map.output=true;
SET mapred.output.compress=true;
SET mapred.output.compression=org.apache.hadoop.io.compress.SnappyCodec;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
SET io.compression.codecs=org.apache.hadoop.io.compress.SnappyCodec;
--導(dǎo)入數(shù)據(jù)
INSERT OVERWRITE TABLE student_avro_snappy SELECT id,name FROM student;
--查詢數(shù)據(jù)
SELECT * FROM student_avro_snappy;
不同壓縮算法比較

數(shù)倉表分區(qū)優(yōu)化
數(shù)據(jù)倉庫創(chuàng)建數(shù)倉表時,ETL開發(fā)人員基于使用習(xí)慣和處理的方便性,經(jīng)常創(chuàng)建多層分區(qū),來存儲數(shù)據(jù)。但是過多的分區(qū)會消耗NameNode大量的資源,并且也會引入小文件的問題。所以對于創(chuàng)建數(shù)倉表的分區(qū),要求如下:
?對于統(tǒng)計數(shù)據(jù)表、數(shù)據(jù)量不大的基礎(chǔ)表、業(yè)務(wù)上無累計快照和周期性快照要求的數(shù)據(jù)表,盡可能的不創(chuàng)建分區(qū),而采用數(shù)據(jù)合并回寫的方式解決;?對于一些數(shù)據(jù)量大的表,如果需要創(chuàng)建分區(qū),提高插敘過程中數(shù)據(jù)的加載速度,盡可能的只做天級分區(qū)。而對于賣點的原始數(shù)據(jù),這種特大的數(shù)據(jù)量的,可以采用小時分區(qū)。對于月分區(qū),堅決去掉。?對于一些周期快照和累計快照的表,我們盡可能只創(chuàng)建日分區(qū)。

版權(quán)聲明:
文章不錯?點個【在看】吧!??




