目录
综述:
Hadoop的数据压缩主要在三个地方:Map数据的输入;Mapper数据的输出;Reduce数据的输出;
MR支持的压缩方式:
压缩格式 | 工具 | 算法 | 文件扩展名 | 是否可切分 |
DEFLATE | 无 | DEFLATE | .deflate | 否 |
Gzip | gzip | DEFLATE | .gz | 否 |
bzip2 | bzip2 | bzip2 | .bz2 | 是 |
LZO | lzop | LZO | .lzo | 是 |
Snappy | 无 | Snappy | .snappy | 否 |
这里谈谈我对上表的理解:我们想要实现 LZO格式的压缩文件,就需要使用把我们的文件压缩成LZO格式的工具,是lzop工具,而这个工具使用的是LZO算法这个方法,这个过程可以理解为,一个文件输入到了一个压缩工具,对这个文件“用刑”,在输出就我们要的压缩格式,这个压缩文件留下这个压缩工具的对其施刑的痕迹---文件扩展名。
记:hadoop的MapReduce默认Mapper,Reducer的输出都不会对文件进行压缩。
压缩格式和对应的编码解码器:
所谓的编码器,就是在指定了压缩的格式之后,去完成相应的压缩格式的工具。解码器就是,当输入是某一种压缩格式的时候,将压缩格式还原。
压缩格式 | 对应的编码/解码器 |
DEFLATE | org.apache.hadoop.io.compress.DefaultCodec |
gzip | org.apache.hadoop.io.compress.GzipCodec |
bzip2 | org.apache.hadoop.io.compress.BZip2Codec |
LZO | com.hadoop.compression.lzo.LzopCodec |
Snappy | org.apache.hadoop.io.compress.SnappyCodec |
压缩性能的比较:
压缩算法 | 原始文件大小 | 压缩文件大小 | 压缩速度 | 解压速度 |
gzip | 8.3GB | 1.8GB | 17.5MB/s | 58MB/s |
bzip2 | 8.3GB | 1.1GB | 2.4MB/s | 9.5MB/s |
LZO | 8.3GB | 2.9GB | 49.3MB/s | 74.6MB/s |
Snappy |
|
| 250MB/s | 500MB/s |
压缩参数的配置:
Hadoop中启用压缩,可以配置如下参数(mapred-site.xml文件中)
参数 | 默认值 | 阶段 | 建议 |
io.compression.codecs (在core-site.xml中配置) | org.apache.hadoop.io.compress.DefaultCodec, org.apache.hadoop.io.compress.GzipCodec, org.apache.hadoop.io.compress.BZip2Codec, org.apache.hadoop.io.compress.Lz4Codec | 输入压缩 | Hadoop使用文件扩展名判断是否支持某种编解码器 |
mapreduce.map.output.compress | false | mapper输出 | 这个参数设为true启用压缩 |
mapreduce.map.output.compress.codec | org.apache.hadoop.io.compress.DefaultCodec | mapper输出 | 使用LZO、LZ4或snappy编解码器在此阶段压缩数据 |
mapreduce.output.fileoutputformat.compress | false | reducer输出 | 这个参数设为true启用压缩 |
mapreduce.output.fileoutputformat.compress.codec | org.apache.hadoop.io.compress. DefaultCodec | reducer输出 | 使用标准工具或者编解码器,如gzip和bzip2 |
mapreduce.output.fileoutputformat.compress.type | RECORD | reducer输出 | SequenceFile输出使用的压缩类型:NONE和BLOCK |
参数解读:
【Mapper输出】:mapreduce.map.output.compress的默认值为false,表明Hadoop中Mapper阶段的输出文件是不经过压缩的,但是如果我们将其设置为了true,Hadoop就会对Mapper的输出数据进行一个压缩,一旦压缩就要涉及到编码器,Hadoop使用默认的编码器DefaultCodec,将Mapper的输出数据压缩成为deflate的格式(可查上面第一张表);of course,我们还可以手动设置我们想要的压缩格式,比如我想要snappy的格式,那就需要去设置编码器为SnappyCodec。
设置为true,能够减少job在MapTask和ReduceTask之间的数据传输量,修改为snappy是为了提升压缩速度。
【Reducer输出】:mapreduce.output.fileoutputformat.compress的默认值为false,表示MapReduce中的Reducer阶段输出文件时不经过压缩的,如果我们设置为true,那么将会使用默认的压缩工具DefaultCodec,对于我们的输出文件进行压缩,压缩为deflate的格式,当然我们可以手动指定压缩工具,从而得到我们想要的压缩格式。除此之外,我们还可以设置快压缩。
Hive中指定Map输出压缩:
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(ename) name from emp;
Hive中指定Reducer输出压缩:
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
'/opt/module/datas/distribute-result' select * from emp distribute by deptno sort by empno desc;
执行结束之后,我们查看一下:
[isea@hadoop108 distribute-result]$ ll
总用量 4
-rw-r--r--. 1 isea isea 446 12月 3 03:32 000000_0.snappy
[isea@hadoop108 distribute-result]$ pwd
/opt/module/datas/distribute-result
[isea@hadoop108 distribute-result]$ cat 000000_0.snappy
¶34MILLERCLERK77821982-1-231300.0\N10
7902FORDANALYST75661981-12-330.20.0JAMES698[1 950 Z,30
1-175000,787-51.YL844TURNERSALESMAN]9-8150a^L39KINGPRESIDENT\N
|SCOTTB斷-4-196柲8CLARKMANAGER7q%6-924耝!BLAKEJ.5-128.º$654MARTINV鎲812114A5!JONESJc4-22975){!§521WARDNa
-1$369SMITHMgAK 2-22a5`499ALLER2-2016
1980A
817800.0\N20
可以看出该文件的后缀为snappy,该文件的内容是你都不认识的sequencefile文件