Hadoop文件压缩Compression

为什么要用压缩?

  • 1.节省磁盘空间
  • 2.减少网络传输,减少shuffle

压缩与解压?

  • 压缩:原始数据 ==> 压缩 ==> 结果数据
  • 解压:结果数据 ==> 解压 ==> 原始数据

在大数据领域中使用压缩主要考虑三个方面:

  • Map端输入:从HDFS上面获取数据量变少,那么处理任务的时间也会相应变少

  • Map端输出:Map端输出数据发送到Reduce中,数据量变少,shuffle的数据变小,效率提高

  • Reduce端输出:Reduce数据写入到磁盘中,数据量变小,磁盘IO变小,效率提高

  • 总结:不仅是MapReduce,大数据中配置压缩需要考虑的是:输入、中间结果、输出

是否需要额外解压?

Hadoop 框架中MR底层就是支持解压的,这里我们不需要额外的操作解压成TextFile

java中的压缩接口:CompressionCodec

压缩的方法
  /**
   * Compress the in buffer to the out buffer.
   * @param in the bytes to compress
   * @param out the uncompressed bytes
   * @param overflow put any additional bytes here
   * @return true if the output is smaller than input
   * @throws IOException
   */
  boolean compress(ByteBuffer in, ByteBuffer out, ByteBuffer overflow
                  ) throws IOException;
                  
解压的方法:
 /**
   * Decompress the in buffer to the out buffer.
   * @param in the bytes to decompress
   * @param out the decompressed bytes
   * @throws IOException
   */
  void decompress(ByteBuffer in, ByteBuffer out) throws IOException;
  

如何选择压缩方式?

选择压缩方式的时候要从压缩比压缩时间来考虑,从而选择合适的压缩方式

常用压缩格式:

Compression format Tool Algorithm File extention
gzip gzip DEFLATE .gz
bzip2 bzip2 bzip2 .bzp2
LZO LZO LZO LZO
Snappy N/A Snappy .snappy

更加详细信息如下

压缩格式 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

hadoop中常用的codec

压缩方式 对应主类
Zlib 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.LzoCodec
Lz4 org.apache.hadoop.io.compress.Lz4Codec
Snappy org.apache.hadoop.io.compress.SnappyCodec

各种压缩方式的压缩比:
在这里插入图片描述

各种压缩的压缩时间比较
在这里插入图片描述

各种压缩的压缩比较:

压缩格式 优点 缺点
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系统下没有对应的命令d. bzip2
bzip2 支持split;具有很高的压缩率,比gzip压缩率都高;hadoop本身支持,但不支持native;在linux系统下自带bzip2命令,使用方便 压缩/解压速度慢;不支持native

总结

不同的场景选择不同的压缩方式,肯定没有一个一劳永逸的方法,如果选择高压缩比,那么对于cpu的性能要求要高,同时压缩、解压时间耗费也多;选择压缩比低的,对于磁盘io、网络io的时间要多,空间占据要多;对于支持分割的,可以实现并行处理。

压缩在hadoop中的应用:

Map端的输入:

MapReduce 从HDFS上面读取数据,如果不采用压缩的话,如果数据量过大会非常消耗性能
可以使用可分片的压缩比如Bzip2,或者使用可分片的数据结构比如SequenceFile,RCFile
比如我们1G的数据,如果支持切分,那么可以分成8个128M的块,用8个MapTask进行处理
如果不支持切分的话只能够用一个MapTask进行处理,效率可想而知。

Map端的输出及中间结果

Map阶段的输出结果溢写到磁盘上面并且需要进行网络传输,如果我们配置压缩去减少写入磁盘的数据量和网络传输的数据量,那么使用压缩后可以相应的提高效率。在此阶段我们可以使用更快速的压缩,比如Lzo,Snappy

Reduce端的输出
如果MR采用链式编程,在此过程中使用压缩从而减少写到磁盘上面的文件,这样可以节省更多的磁盘空间,也有助于效率的提高。

Bzip2 默认支持切分、Lzo默认不支持切分,创建索引后支持切分,所以Map端的输入应选择BZIP2

Map端的输出应该减少磁盘/网络的消耗,可以使用速度较快的Snappy和LZO压缩

Reduce端的输出需要节省磁盘空间,需要选择高压缩比的方式,如果是chain需要考虑分片

生产实践
core-site.xml

  • io.compression.codecs=true

  • io.compression.codec.bzip2.library

mapred-site.xml

  • mapreduce.output.fileoutputformat.compress
  • mapreduce.output.fileoutputformat.compress.codec
  • org.apache.hadoop.io.compress.DefaultCodec
  • mapreduce.map.output.compress
  • mapreduce.map.output.compress.codec org.apache.hadoop.io.compress.DefaultCodec

Hive 中设置压缩:

SET hive.exec.compress.output=true;
SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec;

CREATE TABLE raw (line STRING)
   ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';
 
CREATE TABLE raw_sequence (line STRING)
   STORED AS SEQUENCEFILE;
 
LOAD DATA LOCAL INPATH '/tmp/weblogs/20090603-access.log.gz' INTO TABLE raw;
 
SET hive.exec.compress.output=true;
SET io.seqfile.compression.type=BLOCK; -- NONE/RECORD/BLOCK (see below)
INSERT OVERWRITE TABLE raw_sequence SELECT * FROM raw;

猜你喜欢

转载自blog.csdn.net/qq_43081842/article/details/105173848