当压缩文件做为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);
即使你的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> |
优点:压缩率比较高,压缩/解压速度也比较快,hadoop本身支持。
缺点:不支持分片。
应用场景:当每个文件压缩之后在1个block块大小内,可以考虑用gzip压缩格式。
优点:压缩/解压速度也比较快,合理的压缩率,支持分片,是Hadoop中最流行的压缩格式,支持Hadoop native库。
缺点:压缩率比gzip要低一些,Hadoop本身不支持,需要安装,如果支持分片需要建立索引,还需要指定inputformat改为lzo格式。
应用场景:一个很大的文本文件,压缩之后还大于200M以上的可以考虑,而且单个文件越大,lzo优点越明显。
优点:支持Hadoop native库,高速压缩速度和合理的压缩率。
缺点:不支持分片,压缩率比gzip要低,Hadoop本身不支持,需要安装。
应用场景:当MapReduce作业的map输出的数据比较大的时候,作为map到reduce的中间数据的压缩格式。
优点:支持分片,具有很高的压缩率,比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
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://marco.blog.csdn.net/article/details/81564452
内容来源于网络,如有侵权,请联系作者删除!