`

Hadoop读书笔记(十)MapReduce中的从计数器理解combiner归约

阅读更多

Hadoop读书笔记系列文章:http://blog.csdn.net/caicongyang/article/category/2166855

1.combiner

问:什么是combiner:

答:Combiner发生在Mapper端,对数据进行归约处理,使传到reducer端的数据变小了,传输时间变端,作业时间变短,Combiner不能夸Mapper执行,(只有reduce可以接受多个Mapper的任务)。并不是所有的算法都适合归约处理,例如求平均数

2.代码实现

WordCount.java

 

package combine;

import java.io.IOException;
import java.net.URI;

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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
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;
/**
 * 
 * <p> 
 * Title: WordCount.java 
 * Package counter 
 * </p>
 * <p>
 * Description: 
 *	问:什么是combiner:
 *  答:Combiner发生在Mapper端,对数据进行归约处理,使传到reducer端的数据变小了,传输时间变端,作业时间变短,Combiner不能夸Mapper执行,
 *  (只有reduce可以接受多个Mapper的任务)并不是多少的算法都适合归约处理,例如求平均数
 * 
 * <p>
 * @author Tom.Cai
 * @created 2014-11-26 下午10:47:32 
 * @version V1.0 
 *
 */
public class WordCount {
	private static final String INPUT_PATH = "hdfs://192.168.80.100:9000/hello";
	private static final String OUT_PATH = "hdfs://192.168.80.100:9000/out";

	public static void main(String[] args) throws Exception {
		Configuration conf = new Configuration();
		FileSystem fileSystem = FileSystem.get(new URI(INPUT_PATH), conf);
		Path outPath = new Path(OUT_PATH);
		if (fileSystem.exists(outPath)) {
			fileSystem.delete(outPath, true);
		}
		Job job = new Job(conf, WordCount.class.getSimpleName());
		//1.1设定输入文件
		FileInputFormat.setInputPaths(job, INPUT_PATH);
		//1.2设定输入格式
		job.setInputFormatClass(TextInputFormat.class);
		//指定自定义Mapper类
		job.setMapperClass(MyMapper.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(LongWritable.class);
		//1.3设定分区
		job.setPartitionerClass(HashPartitioner.class);
		job.setNumReduceTasks(1);
		//1.4排序分组
		
		//1.5归约
		job.setCombinerClass(MyReducer.class);
		
		//2.2设定Reduce类
		job.setReducerClass(MyReducer.class);

		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(LongWritable.class);
		//2.3指定输出地址
		FileOutputFormat.setOutputPath(job, new Path(OUT_PATH));
		job.setOutputFormatClass(TextOutputFormat.class);

		job.waitForCompletion(true);
	}

	static class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable> {
		@Override
		protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
			String[] splited = value.toString().split("\t");
			for (String word : splited) {
				context.write(new Text(word), new LongWritable(1));
			}
		}
	}

	static class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable> {
		@Override
		protected void reduce(Text key, Iterable<LongWritable> value, Context context) throws IOException, InterruptedException {
			long count = 0L;
			for (LongWritable times : value) {
				count += times.get();
			}
			context.write(key, new LongWritable(count));
		}

	}

}

 

 

</pre><p></p><pre>

3.加入Combiner后的计数器:

14/12/01 21:26:41 INFO mapred.JobClient: Counters: 19
14/12/01 21:26:41 INFO mapred.JobClient: File Output Format Counters
14/12/01 21:26:41 INFO mapred.JobClient: Bytes Written=20
14/12/01 21:26:41 INFO mapred.JobClient: FileSystemCounters
14/12/01 21:26:41 INFO mapred.JobClient: FILE_BYTES_READ=346
14/12/01 21:26:41 INFO mapred.JobClient: HDFS_BYTES_READ=40
14/12/01 21:26:41 INFO mapred.JobClient: FILE_BYTES_WRITTEN=128546
14/12/01 21:26:41 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=20
14/12/01 21:26:41 INFO mapred.JobClient: File Input Format Counters
14/12/01 21:26:41 INFO mapred.JobClient: Bytes Read=20
14/12/01 21:26:41 INFO mapred.JobClient: Map-Reduce Framework
14/12/01 21:26:41 INFO mapred.JobClient: Map output materialized bytes=50
14/12/01 21:26:41 INFO mapred.JobClient: Map input records=2
14/12/01 21:26:41 INFO mapred.JobClient: Reduce shuffle bytes=0
14/12/01 21:26:41 INFO mapred.JobClient: Spilled Records=6
14/12/01 21:26:41 INFO mapred.JobClient: Map output bytes=52
14/12/01 21:26:41 INFO mapred.JobClient: Total committed heap usage (bytes)=532807680
14/12/01 21:26:41 INFO mapred.JobClient: SPLIT_RAW_BYTES=97
14/12/01 21:26:41 INFO mapred.JobClient: Combine input records=4
14/12/01 21:26:41 INFO mapred.JobClient: Reduce input records=3
14/12/01 21:26:41 INFO mapred.JobClient: Reduce input groups=3
14/12/01 21:26:41 INFO mapred.JobClient: Combine output records=3
14/12/01 21:26:41 INFO mapred.JobClient: Reduce output records=3
14/12/01 21:26:41 INFO mapred.JobClient: Map output records=4

 

4.未加入归约之前的计数器

14/12/01 21:35:27 INFO mapred.JobClient: Counters: 19
14/12/01 21:35:27 INFO mapred.JobClient: File Output Format Counters
14/12/01 21:35:27 INFO mapred.JobClient: Bytes Written=20
14/12/01 21:35:27 INFO mapred.JobClient: FileSystemCounters
14/12/01 21:35:27 INFO mapred.JobClient: FILE_BYTES_READ=362
14/12/01 21:35:27 INFO mapred.JobClient: HDFS_BYTES_READ=40
14/12/01 21:35:27 INFO mapred.JobClient: FILE_BYTES_WRITTEN=128090
14/12/01 21:35:27 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=20
14/12/01 21:35:27 INFO mapred.JobClient: File Input Format Counters
14/12/01 21:35:27 INFO mapred.JobClient: Bytes Read=20
14/12/01 21:35:27 INFO mapred.JobClient: Map-Reduce Framework
14/12/01 21:35:27 INFO mapred.JobClient: Map output materialized bytes=66
14/12/01 21:35:27 INFO mapred.JobClient: Map input records=2
14/12/01 21:35:27 INFO mapred.JobClient: Reduce shuffle bytes=0
14/12/01 21:35:27 INFO mapred.JobClient: Spilled Records=8
14/12/01 21:35:27 INFO mapred.JobClient: Map output bytes=52
14/12/01 21:35:27 INFO mapred.JobClient: Total committed heap usage (bytes)=366034944
14/12/01 21:35:27 INFO mapred.JobClient: SPLIT_RAW_BYTES=97
14/12/01 21:35:27 INFO mapred.JobClient: Combine input records=0
14/12/01 21:35:27 INFO mapred.JobClient: Reduce input records=4
14/12/01 21:35:27 INFO mapred.JobClient: Reduce input groups=3
14/12/01 21:35:27 INFO mapred.JobClient: Combine output records=0
14/12/01 21:35:27 INFO mapred.JobClient: Reduce output records=3
14/12/01 21:35:27 INFO mapred.JobClient: Map output records=4

5.总结

从前后两个计数器输出可以看到:加了归约以后Reduce input records从4变成了3,从Mapper端到Reduce端的作业变少了,传输时间变少了,从而提升了整体的作业时间。

 

 

 

欢迎大家一起讨论学习!

有用的自己收!

记录与分享,让你我共成长!欢迎查看我的其他博客;我的博客地址:http://blog.csdn.net/caicongyang




分享到:
评论

相关推荐

    hadoop学习笔记

    《Hadoop学习笔记》 Hadoop,作为大数据处理的核心框架,是开源社区的杰作,由Apache软件基金会维护。这份文档旨在深入解析Hadoop的基本概念、架构及其在大数据处理中的应用,帮助读者全面掌握这一重要技术。 一、...

    基于MapReduce的词频统计程序及其重构、MapReduce编程之Combiner、Partitioner组件应用.zip

    《基于MapReduce的词频统计程序及其重构与MapReduce编程中的Combiner、Partitioner组件应用》 在当今大数据处理的领域中,Hadoop作为分布式计算框架的重要代表,以其高效、可扩展的特性受到了广泛关注。尤其在人工...

    Hadoop源代码分析(MapReduce概论)

    本文通过对Hadoop MapReduce的核心原理及其源代码的分析,帮助读者深入理解MapReduce的工作机制。 #### 二、Hadoop MapReduce概述 Hadoop MapReduce是一种分布式计算模型,用于处理和生成大型数据集。它将大规模...

    Hadoop技术-MapReduce编程模型.pptx

    它的设计灵感来源于函数式编程语言中的映射(Map)和归约(Reduce)概念,使得开发者可以方便地编写分布式应用程序,处理存储在Hadoop分布式文件系统(HDFS)上的海量数据。 ### 1. MapReduce编程过程 MapReduce的...

    MapReduce & Hadoop

    同时,许多基于Hadoop生态系统的工具和技术都是围绕MapReduce构建的,这使得MapReduce成为了理解大数据处理领域不可或缺的一部分。 #### 七、总结 MapReduce作为一种高效、可靠的分布式计算模型,为解决大规模数据...

    hadoop mapreduce2

    这些JAR文件通常可以从Hadoop的lib目录中获取,包含MapReduce库和其他依赖。 接下来,我们可以开始编写MapReduce程序。除了基本的Map和Reduce函数,我们可能需要自定义逻辑来处理更复杂的数据处理需求。例如,如果...

    Hadoop MapReduce Cookbook

    ### Hadoop MapReduce Cookbook知识点概览 #### 一、Hadoop MapReduce简介 - **定义与功能**:Hadoop MapReduce是一种编程模型,用于处理和生成大数据集,它通过一个并行、分布式算法来实现这一目标。MapReduce将...

    5.Hadoop入门进阶课程_第5周_MapReduce原理及操作.pdf

    ### MapReduce原理及操作知识点详解 #### 一、环境配置与说明 在开始了解MapReduce的具体原理之前,首先需要确保有一个合适的环境来进行实践。本课程使用的环境为: - **操作系统**:CentOS 6.6 64位,单核,1G...

    MapReduce中文文档翻译

    MapReduce是一种编程模型,主要设计用于处理和生成大型数据集,尤其适合大数据处理场景。...尽管后来出现了Hadoop等基于MapReduce的开源框架,MapReduce的核心思想和模式仍然在大数据处理领域发挥着重要作用。

    大数据云计算利器:Hadoop The Definitive Guide,2Ed.pdf

    书籍中深入讨论了Hadoop内部的多个组件,如HDFS如何工作,以及MapReduce的数据流,包括Combiner函数的使用等。此外,还介绍了如何配置和运行分布式MapReduce作业,这为读者提供了深入了解Hadoop内部工作机制的机会。...

    hadoop分析原件

    从给定的文件信息来看,文章主要围绕Hadoop及其核心组件MapReduce展开,详细阐述了MapReduce的概念、设计思路、模型实现、产生的问题以及编程实现和应用等方面。下面,我们将深入探讨这些知识点。 ### 思想起源 ...

    Hadoop实战中文版

    根据提供的文件信息,我们可以从标题、描述以及标签中提炼出几个关键的知识点: ### Hadoop基础知识 1. **Hadoop简介**:Hadoop是一个能够对大量数据进行分布式处理的软件框架,它使得开发者可以在简单的硬件上...

    Hadoop (十五)Hadoop-MR编程 -- 【使用hadoop计算网页之间的PageRank值----编程】

    在本篇中,我们将深入探讨如何使用Hadoop MapReduce编程模型来计算网页之间的PageRank值。PageRank是Google搜索引擎算法的核心部分,它通过衡量网页之间的链接关系来评估每个网页的重要性。在Hadoop环境下,我们可以...

    MapReduce模型--Map端Combiners聚合

    MapReduce模型是大数据处理领域中一种重要的...正确理解和使用Combiner对于优化Hadoop MapReduce作业至关重要。在实际应用中,开发者需要根据具体的场景和需求来决定是否需要使用Combiner以及如何实现Combiner逻辑。

    Hadoop The Definitive Guide 2nd Edition.pdf

    从输入数据到最终输出,整个过程经过了多个阶段的处理,包括映射、排序、归约等。 **Combiner函数:** 为了减少网络传输量和提高效率,在某些情况下可以在Map阶段结束后立即使用Combiner函数对键值对进行局部聚合...

    mapreduce详细流程

    在Hadoop源码中,`org.apache.hadoop.mapred`和`org.apache.hadoop.mapreduce`包下包含了MapReduce的相关类和接口。例如,`MapReduceBase`是许多关键组件的基类,`JobConf`用于配置作业,`InputFormat`和`...

Global site tag (gtag.js) - Google Analytics