千家信息网

Hadoop中使用Combiner有什么好处

发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,这篇文章主要介绍了Hadoop中使用Combiner有什么好处,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用Combiner好处:
千家信息网最后更新 2025年02月04日Hadoop中使用Combiner有什么好处

这篇文章主要介绍了Hadoop中使用Combiner有什么好处,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

使用Combiner好处

减少Mapper任务输出数据量,减少网络传输时间,减少整体Job运行时间。

Combiner仅作用于单个Mapper任务,每个Map任务可能会产生大量的输出,Combiner的作用就是在Map端对输出先做一次合并,以减少传输到Reducer的数据量。

Combiner最基本是实现本地Key的递归,Combiner具有类似本地的Reduce功能。如果不用Combiner,那么所有的结果都是Reduce完成,效率会相对低下,使用Combiner先完成的Map会在本地聚合,提升速度。

注意:Combiner的输出时Reduce的输入,Combiner决不能改变最终的计算结果,所以从我的想法来看,Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完成一致,且不影响最终结果的场景。比如累加,最大值等。

为什么使用Combiner

集群上的可用宽带限制了MapReduce作业的数量,因此最重要的一点是尽量避免Map任务和Reduce任务之间的数据传输。

Hadoop允许用户针对Map任务的输出指定一个合并函数(Combiner)------合并函数的输出作为Reduce函数的输入。

由于合并函数是一个优化方案,所以Hadoop无法确定针对Map任务输出中任一条记录需要调用多少次合并函数。换而言之,不管调用合并函数多少次,Reduce的输出结构都是一致的。

例子:package combiner;import java.io.IOException;import java.net.URI;import java.net.URISyntaxException;import mapreduce.MyMapper;import mapreduce.MyReducer;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;/** * 计算单词 * @author Xr * */public class WordCountApp {    private static final String INPUT_PATH = "hdfs://hadoop:9000/hello";    private static final String OUTPUT_PATH = "hdfs://hadoop:9000/hello1";    public static void main(String[] args)throws Exception {        Configuration conf = new Configuration();        //判处是否存在输入目录        existsFile(conf);        Job job = new Job(conf,WordCountApp.class.getName());                //1.1    从哪里读取数据        FileInputFormat.setInputPaths(job, INPUT_PATH);        //把输入文本中的每一行解析成一个个键值对        job.setInputFormatClass(TextInputFormat.class);                //1.2    设置自定义map函数        job.setMapperClass(MyMapper.class);        job.setMapOutputKeyClass(Text.class);        job.setMapOutputValueClass(LongWritable.class);                //1.3    分区        job.setPartitionerClass(HashPartitioner.class);        job.setNumReduceTasks(1);                //1.4    TODO    排序分组        //1.5    规约        job.setCombinerClass(MyReducer.class);                //2.1    是框架做的,不需要程序员手工干预。        //2.2    自定义reducer函数        job.setReducerClass(MyReducer.class);        job.setOutputKeyClass(Text.class);        job.setOutputValueClass(LongWritable.class);                //2.3    写入到HDFS中        FileOutputFormat.setOutputPath(job, new Path(OUTPUT_PATH));        //格式化类        job.setOutputFormatClass(TextOutputFormat.class);                //提交给JobTracker去执行        job.waitForCompletion(true);    }    private static void existsFile(Configuration conf) throws IOException,            URISyntaxException {        FileSystem fs = FileSystem.get(new URI(INPUT_PATH), conf);        if(fs.exists(new Path(OUTPUT_PATH))){            fs.delete(new Path(OUTPUT_PATH), true);        }    }}

感谢你能够认真阅读完这篇文章,希望小编分享的"Hadoop中使用Combiner有什么好处"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

0