在大数据中为什么要使用压缩
1 减少磁盘的存储空间
2 减少磁盘IO和网络IO
3 加快数据传输速度(磁盘和网络),如果小文件多明显文件传输会明显降低
怎么选一个压缩方式,需要考虑的是什么?
1 考虑文件的压缩效率------》压缩快慢
2 考虑文件的压缩比----------》解压快慢
第一点好理解,压缩的快肯定好
第二点是压缩比,举例现在有一个10G的文件,一种压缩算法能把他压缩成1G,其他压缩算法能把他压缩成3到6G,不能看到压缩到1G的就是最好的。压缩的文件如果需要使用的,使用的一定需要先解压,压缩比这么高,解压的时候就会把CPU拉的特别高,解压也会很慢,所以还要考虑文件的解压速度,服务器的cpu能不能支持。
压缩技术:
压缩有两种:无损压缩(Lossless Compression) 和 有损压缩 (lossy Compression),从英文名上应该更准确一些。
无损压缩一般适用于对数据要求比较高,不允许丢失的场景,我们的大数据选这种;
有损压缩一般适用于图片和视频的文件的处理
几种常见的压缩方式对比:
压缩比:Snappy<LZ4<LZO<GZIP<BZIP2
压缩格式 | 压缩工具 | 算法 | 文件后缀 | 支持分割 | 优点 | 缺点 |
gzip | gzip | default | .gz | 否 | 解压缩速度较好,系统支持好 | 不支持split |
bzip | bzip | bzip2 | .bz2 | 是 | 压缩比高 | 解压缩慢 |
LZO | LZO | LZO | .lzo | 是 | 解压缩快 | 压缩率相比较低 |
LZ4 | LZ4 | LZ4 | .lz4 | 否 | 解压缩速度快 | 压缩比低,不支持split |
snappy | N/A | snappy | .snappy | 否 | 解压缩最快,支持hadoop native库 | 压缩比最低,需要重新编译hadoop,不支持split |
怎么配置snapy的压缩方式
hadoop 是不自带snapy的压缩的,需要重新编译hadoop。
编译成功后,工程中如果想使用snapy压缩方式的话有以下两种方法:
方法1 全局的配置 全部节点的mapred-site.xml配置
<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>
配置修改完一定要重新重启集群
第2种 在代码中配置,可在run方法中配置 map 和reduce 都要配置
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");
configuration.set("mapreduce.output.fileoutputformat.compress.type","RECORD");
configuration.set("mapreduce.output.fileoutputformat.compress.codec","org.apache.hadoop.io.compress.SnappyCodec");
推荐使用第二种配置,因为有些文件不需要压缩,在全局配置文件的配置可能并不需要