文件压缩Compression"/>
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;
更多推荐
Hadoop文件压缩Compression
发布评论