Hadoop入门——MapReduce中的压缩

x33g5p2x  于2021-12-25 转载在 其他  
字(4.2k)|赞(0)|评价(0)|浏览(368)

作为输入

当压缩文件做为mapreduce的输入时,mapreduce将自动通过扩展名找到相应的codec对其解压。

作为输出

当mapreduce的输出文件需要压缩时,可以更改mapred.output.compress为true,mapped.output.compression.codec为想要使用的codec的类名就

可以了,当然你可以在代码中指定,通过调用FileOutputFormat的静态方法去设置这两个属性,我们来看代码:

package com.sweetop.styhadoop;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.compress.GzipCodec;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

/**
* Created with IntelliJ IDEA.
* User: lastsweetop
* Date: 13-6-27
* Time: 下午7:48
* To change this template use File | Settings | File Templates.
*/
public class MaxTemperatureWithCompression {
public static void main(String[] args) throws Exception {
if (args.length!=2){
System.out.println("Usage: MaxTemperature <input path> <out path>");
System.exit(-1);
}
Job job=new Job();
job.setJarByClass(MaxTemperature.class);
job.setJobName("Max Temperature");

FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));

job.setMapperClass(MaxTemperatrueMapper.class);
job.setCombinerClass(MaxTemperatureReducer.class);
job.setReducerClass(MaxTemperatureReducer.class);

job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);

FileOutputFormat.setCompressOutput(job, true);
FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);//设置压缩格式

System.exit(job.waitForCompletion(true)?0:1);

}
}

输入也是一个压缩文件

~/hadoop/bin/hadoop com.sweetop.styhadoop.MaxTemperatureWithCompression input/data.gz output/

输出的每一个part都会被压缩,我们这里只有一个part,看下压缩了的输出

[hadoop@namenode test]$hadoop fs -get output/part-r-00000.gz .
[hadoop@namenode test]$ls
1901  1902  ch2  ch3  ch4  data.gz  news.gz  news.txt  part-r-00000.gz
[hadoop@namenode test]$gunzip -c part-r-00000.gz 
1901<span> </span>317
1902<span> </span>244

如果你要将序列文件做为输出,你需要设置mapred.output.compression.type属性来指定压缩类型,默认是RECORD类型,它会按单个的record压缩,如果指定为BLOCK类型,它将一组record压缩,压缩效果自然是BLOCK好。

当然代码里也可以设置,你只需调用SequenceFileOutputFormat的setOutputCompressionType方法进行设置。

SequenceFileOutputFormat.setOutputCompressionType(job, SequenceFile.CompressionType.BLOCK);

压缩map输出

即使你的mapreduce的输入输出都是未压缩的文件,你仍可以对map任务的中间输出作压缩,因为它要写在硬盘并且通过网络传输到reduce节点,对其压

缩可以提高很多性能,这些工作也是只要设置两个属性即可,我们看下代码里怎么设置:

Configuration conf = new Configuration();
conf.setBoolean("mapred.compress.map.output", true);
conf.setClass("mapred.map.output.compression.codec",GzipCodec.class, CompressionCodec.class);
Job job=new Job(conf);

文件压缩格式分析和比较

Hadoop支持压缩格式:

<br>压缩格式<br><br>可分割<br><br>算法<br><br>扩展名<br><br>Linux工具<br>
<br>gzip<br><br>否<br><br>DEFLATE<br><br>.gz<br><br>gzip<br>
<br>lzo<br><br>是(加索引)<br><br>LZO<br><br>.lzo<br><br>lzop<br>
<br>snappy<br><br>否<br><br>Snappy<br><br>.snappy<br><br>无<br>
<br>Bzip2<br><br>是<br><br>Bzip2<br><br>.bz2<br><br>bzip2<br>
<br>deflate<br><br>否<br><br>DEFLATE<br><br>.deflate<br><br>无<br>
<br>zip<br><br>是<br><br>ZIP<br><br>.zip<br><br>zip<br>

1)Gzip压缩

优点:压缩率比较高,压缩/解压速度也比较快,hadoop本身支持。

缺点:不支持分片。

应用场景:当每个文件压缩之后在1个block块大小内,可以考虑用gzip压缩格式。

2)lzo压缩

优点:压缩/解压速度也比较快,合理的压缩率,支持分片,是Hadoop中最流行的压缩格式,支持Hadoop native库。

缺点:压缩率比gzip要低一些,Hadoop本身不支持,需要安装,如果支持分片需要建立索引,还需要指定inputformat改为lzo格式。

应用场景:一个很大的文本文件,压缩之后还大于200M以上的可以考虑,而且单个文件越大,lzo优点越明显。

3)snappy压缩

优点:支持Hadoop native库,高速压缩速度和合理的压缩率。

缺点:不支持分片,压缩率比gzip要低,Hadoop本身不支持,需要安装。

应用场景:当MapReduce作业的map输出的数据比较大的时候,作为map到reduce的中间数据的压缩格式。

4)bzip2压缩

优点:支持分片,具有很高的压缩率,比gzip压缩率都高,Hadoop本身支持,但不支持native。

缺点:压缩/解压速度慢,不支持Hadoop native库。

应用场景:适合对速度要求不高,但需要较高的压缩率的时候,可以作为mapreduce作业的输出格式,输出之后的数据比较大,处理之后的数据需要压缩存档减少磁盘空间并且以后数据用得比较少的情况。

总结:压缩比:bzip2 > gzip > lzo > snappy ,压缩速度:snappy > lzo> gzip > bzip2

原文转自:https://blog.csdn.net/lastsweetop/article/details/9187721;https://blog.csdn.net/fjssharpsword/article/details/74908251

相关文章