五、压缩和存储
在实际工作当中,hive当中处理的数据,一般都需要经过压缩,可以使用压缩来节省我们的MR处理的网络带宽
- 压缩优点:
减少存储磁盘空间,降低单节点的磁盘IO。
由于压缩后的数据占用的带宽更少,因此可以加快数据在Hadoop集群流动的速度,减少网络传输带宽。
- 压缩缺点:
需要花费额外的时间/CPU做压缩和解压缩计算。
(一)Hadoop压缩
a、Hadoop支持的压缩算法
Haodop对文件压缩均实现org.apache.hadoop.io.compress.CompressionCodec接口,所有的实现类都在org.apache.hadoop.io.compress包下。
b、压缩算法比较
有不少的压缩算法可以应用到Hadoop中,但不同压缩算法有各自的特点。
压缩格式 |
工具 |
算法 |
文件扩展名 |
是否可切分 |
对应的编码/解码器 |
|
DEFAULT |
无 |
DEFLATE |
.deflate |
否 |
org.apache.hadoop.io.compress.DefaultCodec |
|
Gzip |
gzip |
DEFLATE |
.gz |
否 |
org.apache.hadoop.io.compress.GzipCodec |
|
bzip2 |
bzip2 |
bzip2 |
.bz2 |
是 |
org.apache.hadoop.io.compress.BZip2Codec |
|
LZO |
lzop |
LZO |
.lzo |
是(索引) |
com.hadoop.compression.lzo.LzopCodec |
|
LZ4 |
无 |
LZ4 |
.lz4 |
否 |
org.apache.hadoop.io.compress.Lz4Codec |
|
Snappy |
无 |
Snappy |
.snappy |
否 |
org.apache.hadoop.io.compress.SnappyCodec |
|
存放数据到HDFS中,可以选择指定的压缩方式,在MapReduce程序读取时,会根据扩展名自动解压。例如:如果文件扩展名为.snappy,Hadoop框架将自动使用SnappyCodec解压缩文件。
通过上图,我们可以看到哪些压缩算法压缩比更高。
整体排序如下:
Snappy < LZ4 < LZO < GZIP < BZIP2,但压缩比越高,压缩的时间也会更长。以下是部分参考数据:
压缩算法 |
压缩后占比 |
压缩 |
解压缩 |
GZIP |
13.4% |
21 MB/s |
118 MB/s |
LZO |
20.5% |
135 MB/s |
410 MB/s |
Zippy/Snappy |
22.2% |
172 MB/s |
409 MB/s |
d、Mr中开启压缩
1、mapreduce中的压缩
//开启map输出压缩
conf.set("mapreduce.map.output.compress","true");
conf.set("mapreduce.map.output.compress.codec","org.apache.hadoop.io.compress.BZip2Codec");
//开启reduce输出压缩
conf.set("mapreduce.output.fileoutputformat.compress","true");
conf.set("mapreduce.output.fileoutputformat.compress.codec","org.apache.hadoop.io.compress.GzipCodec");
//压缩类型
conf.set("mapreduce.output.fileoutputformat.compress.type","BLOCK");
2、开启Map输出阶段压缩(MR引擎)
开启map输出阶段压缩可以减少job中map和Reduce task间数据传输量。具体配置如下:
1)开启hive中间传输数据压缩功能
set hive.exec.compress.intermediate=true;
2)开启mapreduce中map输出压缩功能
set mapreduce.map.output.compress=true;
3)设置mapreduce中map输出数据的压缩方式
set mapreduce.map.output.compress.codec= org.apache.hadoop.io.compress.SnappyCodec;
4)执行查询语句
select count(1) from t2;
3、开启Reduce输出阶段压缩
当Hive将输出写入到表中时,输出内容同样可以进行压缩。属性hive.exec.compress.output控制着这个功能。用户可能需要保持默认设置文件中的默认值false,这样默认的输出就是非压缩的纯文本文件了。用户可以通过在查询语句或执行脚本中设置这个值为true,来开启输出结果压缩功能。
案例实操:
1)开启hive最终输出数据压缩功能
set hive.exec.compress.output=true;
2)开启mapreduce最终输出数据压缩
set mapreduce.output.fileoutputformat.compress=true;
3)设置mapreduce最终数据输出压缩方式
set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
4)设置mapreduce最终数据输出压缩为块压缩
set mapreduce.output.fileoutputformat.compress.type=BLOCK;
5)测试一下输出结果是否是压缩文件
insert overwrite local directory '/home/offcn/tmp/hive-reducecompress/' select count(1) from t2;
(二)文件存储格式
Hive支持的存储数的格式主要有:TEXTFILE(行式存储) 、SEQUENCEFILE(行式存储)、ORC(列式存储)、PARQUET(列式存储)。
(1)列式存储和行式存储
- 行式存储: