介绍

hive表常用的存储格式主要包括:orc、parquet、avro、rcfile、sqeuencefile几种,存储格式一般会选择综合性能最好的orc或者parquet,这两种都是列式存储格式。压缩格式一般会选择snappy、lzo、gizp,针对不同的应用场景使用不同的压缩方式。

原文件:1403M

压缩格式压缩大小压缩时间解压时间是否可切分
Snappy/6.4s19.8s不可切分
LZ4693M6.4s2.36s不可切分
LZO684M7.6s11.1s带序号可切分
GZIP447M85.6s21.8s不可切分
BZIP2390M142.3s62.5s可切分

压缩比和压缩时间成反比,压缩比越小,耗费时间越大

总结: hive一般用orc,spark一般用parquet,snappy配合parquet性能最高。

压缩方式选择(hive table):

数据量大,计算性能要求不高的业务数据,一般用gzip(压缩比最高,压缩解压缩速度最慢)

计算性能要求较高,数据量不是特别大的业务数据,一般用lzo或者snappy (压缩比没有gzip高,但是压缩解压速度较快)

1
2
3
4
5
6
7
8
// snappy:
row format delimited fields terminated by '\t'
stored as orc tblproperties("orc.compress"="SNAPPY");

// lzo:
stored as INPUTFORMAT'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
OUTPUTFORMAT'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
location '/user/pmp_bi/test/testlog/'

MR阶段过程:

input -> map -> shuffle -> reduce -> output

shuffle 阶段几个重要内容:

分区 -> 排序 -> 分组 -> combiner(map端的reduce) -> 压缩 -> map阶段输出

compression压缩:

map 输出 和 reduce 输出

1.中间数据压缩

1
2
3
4
set hive.exec.compress.intermediate=true;    -- 激活中间数据压缩功能,默认false
-- 设置Map 阶段输出压缩格式
set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
set mapred.map.output.compression.codec=com.hadoop.compression.lzo.LzoCodec;

1.最终数据压缩

1
2
3
4
5
set hive.exec.compress.output=true;
-- 设置Reduce 输出压缩格式
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
-- 设置mapreduce最终数据输出压缩为块压缩
set mapreduce.output.fileoutputformat.compress.type=BLOCK;

存储方式选择(hive table):

Hive数据表的默认格式 textfile ,存储方式:行存储。

选择综合性能最优的两种存储格式:orc和parquet 。

磁盘空间占用: orc<parquet<textfile

查询速度和压缩比: orc>parquet>textfile

hive一般用orc,spark一般用parquet,snappy配合parquet性能最高。

1
2
3
4
5
6
7
8
-- hive建表
STORED AS TEXTFILE;
STORED AS PARQUET;
STORED AS ORC ;
-- 不压缩
STORED AS orc tblproperties ("orc.compress"="NONE");
-- Snappy压缩
STORED AS orc tblproperties ("orc.compress"="Snappy");