数据压缩的意义和好处
在shuffle阶段,有大量的数据拷贝操作:
- 从Map阶段输出的数据,通过网络拷贝,发送到reduce阶段。
这其中涉及了大量的网络IO,如果数据能够进行压缩,那么数据的发送了就会少的多。
文件压缩的好处就显而易见了:
- 节约磁盘空间
- 加速数据在网络和磁盘上的传输
数据压缩格式的对比
常用的数据压缩算法:
常用的算法为LZO和snappy
hadoop支持的压缩算法:
压缩格式 | 工具 | 算法 | 文件扩展名 | 是否可切分 |
---|---|---|---|---|
DEFLATE | 无 | DEFLATE | .deflate | 否 |
Gzip | 无 | DEFLATE | .deflate | 否 |
DEFLATE | gzip | DEFLATE | .gz | 否 |
bzip2 | bzip2 | bzip2 | bz2 | 是 |
LZO | lzop | LZO | .lzo | 否 |
LZ4 | 无 | LZ4 | .lz4 | 否 |
Snappy | 无 | Snappy | .snappy | 否 |
使用不可压缩的数据算法压缩的文件,即使大小超过128M,也不会切割成多个split
强行切分会损坏文件
hadoop压缩算法对应的java类:
压缩格式 | 对应使用的java类 |
---|---|
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 |
LZ4 | org.apache.hadoop.io.compress.Lz4Codec |
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-bset | 8.3GB | 2GB | 4MB/s | 60.6MB/s |
LZO | 8.3GB | 2.9GB | 135 MB/s | 410 MB/s |
snappy | 8.3GB | 1.8GB | 172MB/s | 409MB/s |
查看当前hadoop支持的数据压缩算法:
hadoop checknative
添加压缩后的mr执行流程
- MapReduce
- input
- mapper
- shuffle
- partitioner、sort、combiner、【compress】、group
- reducer
- output
如何开启数据压缩
在代码中进行设置压缩
设置map阶段的压缩:
Configuration configuration = new Configuration();
configuration.set("mapreduce.map.output.compress","true");
configuration.set("mapreduce.map.output.compress.codec",
"org.apache.hadoop.io.compress.SnappyCodec");
设置我reduce阶段的压缩:
configuration.set("mapreduce.output.fileoutputformat.compress","true");
//只有是Sequence的时候,以下Record压缩才起作用
configuration.set("mapreduce.output.fileoutputformat.compress.type","RECORD");
configuration.set("mapreduce.output.fileoutputformat.compress.codec",
"org.apache.hadoop.io.compress.SnappyCodec");
- 设置snappy压缩之后的输出文件都以
.snappy
结尾
修改mapred-site.xml进行MapReduce压缩(修改后需要重启集群)
- 修改配置文件并重启集群后,所有的mr任务都会进行压缩
map输出数据进行压缩
<property>
<name>mapreduce.map.output.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.map.output.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
reduce输出数据进行压缩
<property>
<name>mapreduce.output.fileoutputformat.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.output.fileoutputformat.compress.type</name>
<value>RECORD</value>
</property>
<property>
<name>mapreduce.output.fileoutputformat.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>