概述
- 压缩:压缩是一种通过特定的算法来减小计算机文件大小的机制,简单来说就是使用相关压缩技术将文件内容减少的过程
优点:
1.节省存储空间
2.减少网络带宽IO
3.减少磁盘IO缺点:
1.压缩解压会有CPU开销
2.消耗时间分类:
1.Lossless 无损压缩,应用在一些日志文件等
2.Lossy 有损压缩,应用在图片,视频文件等
常用的压缩技术及比较:
- 针对以上压缩技术进行测试
测试环境:
8 core i7 cpu
8GB memory
64 bit CentOS
1.4GB Wikipedia Corpus 2-gram text input 结果
压缩比(Compression Ratio)
1. Snappy(50%)<LZ4(51%)<LZO(51.2%)<GZip(68%)<BZip2(72%)
压缩速率(Compression Speed)
1. 可以看出压缩比越高,压缩时间越长:Snappy<LZ4<LZO<GZIP<BZIP2
gzip:
优点:压缩比在四种压缩方式中较高;hadoop本身支持,在应用中处理gzip格式的文件就和直接处理文本一样;有hadoop native库;大部分linux系统都自带gzip命令,使用方便。
缺点:不支持split。lzo压缩
优点:压缩/解压速度也比较快,合理的压缩率;支持split,是hadoop中最流行的压缩格式;支持hadoop native库;需要在linux系统下自行安装lzop命令,使用方便。
缺点:压缩率比gzip要低;hadoop本身不支持,需要安装;lzo虽然支持split,但需要对lzo文件建索引,否则hadoop也是会把lzo文件看成一个普通文件(为了支持split需要建索引,需要指定inputformat为lzo格式)。snappy压缩
优点:压缩速度快;支持hadoop native库。
缺点:不支持split;压缩比低;hadoop本身不支持,需要安装;linux系统下没有对应的命令。bzip2压缩
优点:支持split;具有很高的压缩率,比gzip压缩率都\高;hadoop本身支持,但不支持native;在linux系统下自带bzip2命令,使用方便。
缺点:压缩/解压速度慢;不支持native。
总结
1.压缩方式的选择应根据不同的应用场景做出相应的选择,利弊权衡做出最优选择。
2.对于需要并行处理的过程,应优先考虑可split的压缩,这会使得任务被并行处理,缩短处理时间。
3.hadoop应根据输入,中间,输出,不同的过程进行合适选择
Hadoop配置压缩
core-site.xml
1. <property> 2. <name>io.compression.codecs</name> 3. <value> 4. org.apache.hadoop.io.compress.GzipCodec, 5. org.apache.hadoop.io.compress.DefaultCodec, #zlib->Default 6. org.apache.hadoop.io.compress.BZip2Codec, 7. org.apache.hadoop.io.compress.LzoCodec, 8. org.apache.hadoop.io.compress.Lz4Codec, 9. org.apache.hadoop.io.compress.SnappyCodec, 10. </value> 11. </property>
mapred-site.xml
1. <property> 2. #支持压缩 3. <name>mapreduce.output.fileoutputformat.compress</name> 4. <value>true</value> 5. </property> 6. #压缩方式 7. <property> 8. <name>mapreduce.output.fileoutputformat.compress.codec</name> 9. <value>org.apache.hadoop.io.compress.BZip2Codec</value> 10. </property>
压缩在MR中的应用
考虑思路:hdfs ==> map ==> shuffle ==> reduce
1. Use Compressd Map Input:从HDFS中读取文件进行Mapreuce作业,如果数据很大,可以使用压缩并且选择支持分片的压缩方式(Bzip2,LZO),可以实现并行处理,提高效率,减少磁盘读取时间,同时选择合适的存储格式例如Sequence Files,RC,ORC等;
2. Compress Intermediate Data:Map输出作为Reducer的输入,需要经过shuffle这一过程,需要把数据读取到一个环形缓冲区,然后读取到本地磁盘,所以选择压缩可以减少了存储文件所占空间,提升了数据传输速率,建议使用压缩速度快的压缩方式,例如Snappy和LZO.
3. Compress Reducer Output:进行归档处理或者链接Mapreduce的工作(该作业的输出作为下个作业的输入),压缩可以减少了存储文件所占空间,提升了数据传输速率,如果作为归档处理,可以采用高的压缩比(Gzip,Bzip2),如果作为下个作业的输入,考虑是否要分片进行选择。
中间压缩选择和配置
对于Shuffle过程压缩的选择,应考虑压缩速率来减少CPU处理时间
配置mapred-site.xml以使用压缩:1. <property> 2. <name>mapreduce.map.output.compression</name> 3. <value>true</value> 4. </property> 5. <property> 6. <name>mapreduce.map.output.compression.codec</name> 7. <value>org.apache.hadoop.io.compress.SnappyCodec</value> 8. </property>
最终压缩选择和配置
1. <property> 2. <name>mapreduce.output.fileoutputformat.compress</name> 3. <value>true</value> 4. </property> 5. <property> 6. <name>mapreduce.output.fileoutputformat.compress.codec</name> 7. <value>org.apache.hadoop.io.compress.BZip2Codec</value> 8. </property>
使用wc进行实例说明:
input.txt文件1. [hadoop@hadoop data]$ cat input.txt 2. hello java 3. hello hadoop 4. hello hive 5. hello sqoop 6. hello hdfs 7. hello spark
mapred-site.xml
1. <configuration> 2. <property> 3. <name>mapreduce.framework.name</name> 4. <value>yarn</value> 5. </property> 6. <property> 7. <name>mapreduce.output.fileoutputformat.compress</name> 8. <value>true</value> 9. </property> 10. <property> 11. <name>mapreduce.output.fileoutputformat.compress.codec</name> 12. <value>org.apache.hadoop.io.compress.BZip2Codec</value> 13. </property> 14. </configuration>
计算wc
1. [hadoop@hadoop mapreduce]$ hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /input.txt /wc/output
2. [hadoop@hadoop mapreduce]$ hdfs dfs -ls /wc/output
3. Found 2 items
4. -rw-r--r-- 3 hadoop supergroup 0 2018-03-02 15:54 /wc/output/_SUCCESS
5. -rw-r--r-- 3 hadoop supergroup 77 2018-03-02 15:54 /wc/output/part-r-00000.bz2
6. .bz2出现成功
Hive使用压缩
- 设置
SET hive.exec.compress.output=true; //默认不支持压缩
SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec;