采用Hive作为数据仓库工具,由于数仓既要存储来自不同系统的数据源,还要执行ETL数据任务,所以Hive不仅提供了多种存储格式(TEXTFILE,ORC,PARQUET),降低了存储成本,而且还支持多种压缩方式(zlib,snappy,bzip2),提高了计算效率。那么,不同的业务场景该选择哪一种存储格式或压缩方式呢?

0x00 存储格式

TEXTFILE是Hive默认的存储格式,存储空间消耗比较大,并且压缩的text无法分割和合并,查询的效率最低,可以直接存储,加载数据的速度最高;

ORC存储格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache Hive,用于降低Hadoop数据存储空间和加速Hive查询速度。

Parquet仅仅是一种存储格式,它是语言、平台无关的,并且不需要和任何一种数据处理框架绑定,目前能够和Parquet适配的组件很多,基本上通常使用的查询引擎和计算框架都已适配,并且可以很方便的将其它序列化工具生成的数据转换成Parquet格式。

文件格式 存储方式 压缩比 查询速度 文件拆分 支持压缩
TEXTFILE 行式 不可切分 NONE, GZIP
ORC 列式 可切分 NONE, ZLIB, SNAPPY
PARQUET 列式 可切分 NONE, SNAPPY,BZIP2

Hive创建表时,使用 stored as [file_format] 关键字指定存储格式。

0x01 压缩方式

1403M的原文件,不同压缩方式的特点如下:

压缩方式 压缩大小 压缩时间 解压时间 文件切分
Snappy 701M 6.4s 19.8s 不可切分
LZ4 693M 6.4s 2.36s 不可切分
LZO 684M 7.6s 11.1s 带序号可切分
GZIP 447M 85.6s 21.8s 不可切分
BZIP2 390M 142.3s 62.5s 可切分

Hive选择MapReduce作为执行引擎时,不同阶段适合不同的压缩方式,建议如下:

MapReduce与压缩

通过上图可以看出,有三次的压缩,对应有不同的参数如下

1
2
3
4
5
6
7
8
9
10
11
12
13
---1)Map端的输出压缩
set mapreduce.map.output.compress=true;
set mapreduce.map.output.compress.codec=org.apache.Hadoop.io.compress.SnappyCodec;
---2)Reduce端的输出压缩
set hive.exec.compress.output=true;
set mapreduce.output.fileoutputformat.compress=org.apache.hadoop.io.compress.GzipCodec;
set mapreduce.output.fileoutputformat.compress.type=BLOCK;
---3)Job之间的输出压缩
set hive.exec.compress.intermediate=true;
set mapreduce.output.fileoutputformat.compress=org.apache.hadoop.io.compress.BZip2Codec;
---4)其他
set hive.exec.orc.default.compress=ZLIB;
set hive.exec.orc.compression.strategy=SPEED;

参考文献

File Formats and Compression
Hive Configuration Properties
mapred-default.xml