mapreduce中的combine过程

hadoop的map过程执行完成后,每一个map都可能会产生大量的本地输出,Combiner的作用就是对map端的输出先做一次合并,减少在map和reduce节点之间的数据传输量,提高网络I/O性能。

Combiner最基本的就是实现本地key的聚合,对map输出的key 排序,value进行迭代。Combiner在本质上就是一个本地的Reducer,其输入<Key, Value>和输出<Key,Value>类型是一致的。如果不用Combiner,所有的结果都在Reducer中进行合并。

但是,不要以为在MapReduce程序中设置了Combiner,Combiner就一定能够执行,也不能假定Combiner执行的次数(由于我们项目中就对Combiner进行了仅能执行一次的假定,造成了程序执行的不确定性,有时能够正常执行,而出现问题时发现重新执行几次偶尔能够执行成功,这也是传说中的“撞大运编程”)。

Combiner函数可能会在map的merge操作完成之前,也可能在merge之后执行,这个时机由配置参数min.num.spill.for.combine指定(该值默认为3),也就是说在map端产生的spill文件最少有min.num.spill.for.combine的时候,Combiner函数会在merge操作合并最终的本机结果文件之前执行,否则在merge之后执行。通过这种方式,就可以在spill文件很多并且需要做conbine的时候,减少写入本地磁盘的数据量,同样也减少了对磁盘的读写频率,可以起到优化作业的目的。

hadoop文档中也有说明Combiner可能被执行也可能不被执行,如果当前集群在很繁忙的情况下job就是设置了也不会执行Combiner。

需要注意的是,虽然combiner使用合适可以提高Job执行作业的吞吐量,但不合适的应用场景可能导致输出结果不正确。Combiner的输出是Reducer的输入,绝不能改变最终的计算结果。

需求分析

最终回到项目实际问题的所在,我们需要执行的是一个汇总统计,这个汇总统计有这么几个需求:

  • 根据结果数据,对结果需要进行合并统计分析,共两项指标,如果第一项指标大于4或第二项指标大于8时,最终的结果数据就为不合格;
  • 如果最终的指标统计全部放到Reduce端来做,就会导致数据量过大,因为我们需要的执行结果为单个文件,Reducer的数量设置为1,因此需要Combiner的帮助;
  • Combiner的执行次数不能影响最终结果(之前的版本就是因为依赖了Combiner的执行次数,导致了结果的不确定性)。

经过简单地分析,我们将这个过程简单抽象成三种不同的状态:

  • 初始状态(当前没有值,当然这只是一种中间状态);
  • 有数据状态(此时,数据会进行累积,但是还没有到达不合格状态);
  • 不合格状态(这是一种最终状态,此时对需要combine的所有值,均不需要再进行任何操作);

状态模式

策略模式是围绕着可以互换的算法来创建成功的业务的,而状态模式通过改变对象内部状态来帮助对象控制自己的行为。

使用状态模式后处理的类图结构:

CombinerMediator在每个具体状态对象中合并过来的参数来改变自己的状态,已确定当前处于的状态;

IMapResultValue作为Mapper端输出的结果,分成几种类型,其中MapResultElement为Map端输出的单条记录;其余两种类型分别对应状态对象的输出结果。

最终结果还需要在Reducer端进行最后一次合并,其过程与Combiner类似,状态模式的使用保证无论经过多少次执行,最终结果状态都是一致的。

状态模式允许对象在内部状态改变时,改变其行为,对象看起来修改了它的类。每种状态都封装成了具体的类,并将动作委托到代表当前状态的对象,行为会根据内部状态的改变而改变,在这里CombinerMediator会随着状态的内部combineStat的改变而后续行为改变。

其类图与策略模式是一样的,区别就在于其意图。在状态模式中,我们将一群行为封装在状态对象中,CombinerMediator会随时可委托到那些状态对象中的一个,当前状态在不同的状态对象集合中游走改变,反映context内部的状态,CombinerMeditor的行为也会改变。相比于策略模式,我们把状态模式想像成是不用在中间对象CombinerMediator中放置过多条件判断的替代方法。

combiner中使用状态模式的更多相关文章

  1. 让对象拥有状态——C#中的状态模式

    大家好,老胡又在博客和大家见面了,在聊今天的主角之前,老胡先给大家讲一个以前发生的故事.   真实的故事 当老胡还是小胡的时候,跟随团队一起开发一款游戏.这款游戏是一款末日生存类游戏,玩家可以 收集资 ...

  2. (二十一)状态模式详解(DOTA版)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本次LZ给各位介绍状态模式, ...

  3. State Pattern -- 状态模式原理及实现(C++)

    主要参考<大话设计模式>和<设计模式:可复用面向对象软件的基础>两本书.本文介绍命令模式的实现. 问题出发点 在实际开发中,我们经常会遇到这种情况:一个对象有多种状态,在每一个 ...

  4. javascript设计模式学习之十六——状态模式

    一.状态模式的定义 状态模式的关键是区分事务内部和外部的状态,事务内部状态改变往往会带来事务的行为改变. 状态模式中有意思的一点是,一般我们谈到封装,都是优先封装对象的行为,而非对象的状态.但在状态模 ...

  5. [设计模式] 20 状态模式 State Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对状态模式是这样说的:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.状态模式的重点在于状态转换,很多时候,对 ...

  6. C++设计模式之状态模式(四)

    4.状态模式总结 状态模式将一个对象在不同状态下的不同行为封装在一个个状态类中,通过设置不同的状态对象能够让环境对象拥有不同的行为.而状态转换的细节对于client而言是透明的.client不直接操作 ...

  7. 折腾Java设计模式之状态模式

    原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...

  8. C++设计模式——状态模式

    前言 在实际开发中,我们经常会遇到这种情况:一个对象有多种状态,在每一个状态下,都会有不同的行为.那么在代码中我们经常是这样实现的. typedef enum tagState { state, st ...

  9. JavaScript状态模式及状态机模型

    这是一篇,我自己都看不完的文章... 文章大体就两部分: 状态模式的介绍 状态机模型的函数库javascript-state-machine的用法和源码解析 场景及问题背景: 我们平时开发时本质上就是 ...

随机推荐

  1. C++复制控制:赋值操作符和析构函数

    一.赋值操作符 类定义了该类型对象赋值时会发生什么.与拷贝构造函数一样,如果类没有定义自己的赋值操作符,编译器会合成一个. 1.重载操作符的简单介绍 重载操作符是一些函数,其名字为operator后跟 ...

  2. yxy-插入formid-并发/压力(入参的变量化)

    1.抓取接口如下 2.该接口为插入数据库操作,由于前段操作频繁,就简单压测一下 接口中formId.accountId.openId为变量 formId为随机生成插入:accountId.openId ...

  3. BZOJ5450: 轰炸(水题,Tarjan缩点求最长路)

    5450: 轰炸 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 43  Solved:18[Submit][Status][Discuss] Desc ...

  4. MVC 页面间的传值

    关于MVC页面之间的传值,有多种方式,下面,我们就Html.RenderAction 方式 和 Html.RenderPartial 方式 来给大家分享一下有什么不同. 一.Html.RenderAc ...

  5. Python学习-类

    类是对象的模板或蓝图,类是对象的抽象化,对象是类的实例化 在python中,一个对象的特征也称为属性(attribute),它所具有的的行为也称为方法(method) 对象 = 属性(特征)+方法(行 ...

  6. 1153 Decode Registration Card of PAT (25 分)

    A registration card number of PAT consists of 4 parts: the 1st letter represents the test level, nam ...

  7. oracle-分区(笔记)

    partition by 用于指定分区方式 range 表示分区的方式是范围划分 partition pn 用于指定分区的名字 values less than 指定分区的上界(上限) ------- ...

  8. 《selenium2 python 自动化测试实战》(21)——unittest单元测试框架解析

    unittest是展开自动化测试的基础——这个框架很重要! 我们先自己写一个测试类: 1.被测试类 Widthget.py: # coding: utf-8 class Widthget:    de ...

  9. python scrapy ip代理的设置

    在scrapy项目中建一个与spider同级的python目录并在下面添加一个py文件内容为 # encoding: utf-8import base64proxyServer = 代理服务器地址 # ...

  10. JS脚本不能运行

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/moqiang02/article/details/25898295 这段时间在做前端的动态页面,出了 ...