1、压缩的定义:压缩是指以某种格式对文件进行归档操作
好处:节省空间、减少I/O(磁盘I/O和网络I/O)、加快传输
缺点:增加CPU负载,集群负载较高(会造成job堵塞)时不建议使用压缩
2、压缩的分类:分类1:Lossless无损压缩 Lossy有损压缩
分类2:对称压缩和非对称压缩
3、压缩的应用场景:
输入:map
中间:shuffle
输出:reduce
4、常用的压缩格式:
原始数据:1403MB
Snappy(压缩比50%,最大)、701MB
Lz4 693MB
Lzo(压缩比和Lz4相当,做了索引就可以分割了) 684MB
Gzip(压缩比第二小) 447MB
BZip2(压缩比最小,支持分割) 390MB
5、压缩格式对比
6、分割
7、压缩格式对应的codec
8、几个小问题
问题1:
若Flume采集的数据要进行分布式计算,那Flume用什么压缩格式?
Flume采集数据执行的是一个MapReduce程序,压缩格式只有支持分割,效率才会高,故可以采用BZip2和Lzo两种压缩格式
问题2:
冷数据是用什么压缩格式?
冷数据用到的次数较少,我们更追求让其占用更小的空间,如果该数据是基于HDFS的,则可使用BZip2格式。
9、在Hadoop上配置压缩
#hadoop要使用压缩的前提是,安装的hadoop 是经过编译的,并且安装了对应的压缩类
A。查看hadoop支持哪些压缩格式的命令:hadoop checknative
B。更改配置文件
vi core-site.xml
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
</value>
</property>
vi mapred-site.xml
<property>
<name>mapreduce.output.fileoutputformat.compress</name>
<value>true</value>
</property>
#打开mapreduce输出(等同于reduce的输出)的压缩开关
<property>
<name>mapreduce.output.fileoutputformat.compress.codec</name>
<value>org.apache.hadoop.io.compress.BZip2Codec</value>
</property>
#将reduce输出文件的压缩类型设置为BZip2
<property>
<name>mapreduce.map.output.fileoutputformat.compress</name>
<value>true</value>
</property>
#打开map输出的压缩开关
<property>
<name>mapreduce.map.output.fileoutputformat.compress.codec</name>
<value>org.apache.hadoop.io.compress.BZip2Codec</value>
</property>
#将map输出文件的压缩类型设置为BZip2
#经过以上配置后的hadoop执行MR程序后输出文件为一个BZip格式的压缩文件
10、在hive上进行压缩的配置
set hive.exec.compress.output=true;
打开开关
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec;
设置codec
#经过以上配置后hive上的文件将比本地上的源文件小很多,因为hive上的文件经过了压缩
执行以上两条命令后再进行正常的hive操作,此时的hive上的操作文件都是经过压缩的,并且格式为BZip2
正常的hive操作之后记得将hive.exec.compress.output 设置为默认值
查看hive上某个属性的初始值: set hive.exec.compress.output;(查看hive.exec.compress.output的初始值)
问题3:为什么不在hive-site.xml文件中进行属性的修改?
在以上配置文件中修改后将会作用于所有的hive操作,不利于hive的个性化配置