文章目录
1. 什么是压缩
压缩就是通过某种技术(算法)把原始文件变小,相应的解压就是把压缩后的文件变成原始文件
- 想要对hadoop中压缩,解压进行深刻的认识,可以从该路线进行思考:hdfs ==> map ==> shuffle ==> reduce
2. 压缩格式
压缩格式 | UNIX工具 | 算法 | 文件扩展名 | 可分割 |
---|---|---|---|---|
DEFLATE | 无 | DEFLATE | .deflate | No |
gzip | gzip | DEFLATE | .gz | No |
LZ4 | 无 | LZ4 | .LZ4 | NO |
bzip | bzip | bzip | .bz2 | YES |
LZO | lzop | LZO | .lzo | YES if indexed |
Snappy | 无 | Snappy | .snappy | NO |
找了一个简单的案例对于集中压缩方式之间的压缩比和压缩速度进行一个感观性的认识
- 压缩比
- 压缩时间
可以看出压缩比越高,压缩时间越长,压缩比: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。
3. 压缩的优缺点
对于压缩的好处可以从两方面考虑:Storage + Compute;
- Storage :基于HDFS考虑,减少了存储文件所占空间,提升了数据传输速率;
- Compute:基于YARN上的计算(MapReduce/Hive/Spark/….)速度的提升。
在hadoop大数据的背景下,这两点尤为重要,怎样达到一个高效的处理,选择什么样的压缩方式和存储格式(下篇博客介绍)是很关键的。
从这幅图带领大家进一步认识压缩于解压的优缺点,看到这幅图后你们有一定自己的认识吗?
- 优点:减少存储空间(HDFS),降低网络带宽,减少磁盘IO
- 缺点:既然存在优点,那必然存在缺点,那就是CPU啦,压缩和解压肯定要消耗CPU的,如果CPU过高那肯定会导致集群负载过高,从而导致你的计算缓慢,job阻塞,文件读取变慢一系列原因。
4. 中间压缩的配置和最终结果压缩的配置
可以使用hadoop checknative
检测本机有哪些可用的压缩方式
可参考编译hadoop,支持多种压缩格式文章进行编译
配置文件的修改
- core-site.xml
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec, #zlib->Default
org.apache.hadoop.io.compress.BZip2Codec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec,
org.apache.hadoop.io.compress.Lz4Codec,
org.apache.hadoop.io.compress.SnappyCodec,
</value>
</property>
- mapred-site.xml
<property>
<!--支持压缩-->
<name>mapreduce.output.fileoutputformat.compress</name>
<value>true</value>
</property>
<!--压缩方式-->
<property>
<name>mapreduce.output.fileoutputformat.compress.codec</name>
<value>org.apache.hadoop.io.compress.BZip2Codec</value>
</property>
- 中间压缩:中间压缩就是处理作业map任务和reduce任务之间的数据,对于中间压缩,最好选择一个节省CPU耗时的压缩方式(快)
hadoop压缩有一个默认的压缩格式,当然可以通过修改mapred.map.output.compression.codec属性,使用新的压缩格式,这个变量可以在mapred-site.xml 中设置
<property>
<name>mapred.map.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
<description> This controls whether intermediate files produced by Hive
between multiple map-reduce jobs are compressed. The compression codec
and other options are determined from hadoop config variables
mapred.output.compress* </description>
</property>
- 最终压缩:可以选择高压缩比,减少了存储文件所占空间,提升了数据传输速率
mapred-site.xml 中设置
<property>
<name>mapreduce.output.fileoutputformat.compress.codec</name>
<value>org.apache.hadoop.io.compress.BZip2Codec</value>
</property>
5. 计算WC使用不同的压缩格式
- 准备一份input.txt文件,上传到hdfs的/wc/input目录
[hadoop@hadoop614 ~]$ hadoop fs -ls /wc/input
Found 1 items
-rw-r--r-- 1 hadoop supergroup 70 2019-04-19 05:08 /wc/input/input.txt
[hadoop@hadoop614 ~]$ hadoop fs -cat /wc/input/input.txt
hello java
hello hadoop
hello hive
hello sqoop
hello hdfs
hello spark
5.1 使用Bzip2压缩方式
- 编辑mapred-site.xml
[hadoop@hadoop614 hadoop]$ vim mapred-site.xml
<!-- BZip2 -->
<property>
<name>mapreduce.output.fileoutputformat.compress.codec</name>
<value>org.apache.hadoop.io.compress.BZip2Codec</value>
</property>
- 执行wc
[hadoop@hadoop614 mapreduce]$ cd ~/app/hadoop/share/hadoop/mapreduce/
[hadoop@hadoop614 mapreduce]$ hadoop jar ~/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /wc/input/input.txt /wc/output
- 查询结果
[hadoop@hadoop614 hadoop]$ hadoop fs -ls /wc/output
Found 2 items
-rw-r--r-- 1 hadoop supergroup 0 2019-04-19 05:22 /wc/output/_SUCCESS
-rw-r--r-- 1 hadoop supergroup 77 2019-04-19 05:22 /wc/output/part-r-00000.bz2
5.2 snappy压缩格式
- 编辑mapred-site.xml
[hadoop@hadoop614 hadoop]$ vim mapred-site.xml
<property>
<name>mapreduce.output.fileoutputformat.compress.codec</name>
<!-- BZip2
<value>org.apache.hadoop.io.compress.BZip2Codec</value>
-->
<!-- snappy -->
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property
- 执行wc
[hadoop@hadoop614 mapreduce]$ cd ~/app/hadoop/share/hadoop/mapreduce/
[hadoop@hadoop614 mapreduce]$ hadoop jar ~/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /wc/input/input.txt /wc/output
- 查询结果
[hadoop@hadoop614 hadoop]$ hadoop fs -ls /wc/output/snappy
Found 2 items
-rw-r--r-- 1 hadoop supergroup 0 2019-04-19 05:29 /wc/output/snappy/_SUCCESS
-rw-r--r-- 1 hadoop supergroup 63 2019-04-19 05:29 /wc/output/snappy/part-r-00000.snappy