combiner中使用状态模式
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中使用状态模式的更多相关文章
- 让对象拥有状态——C#中的状态模式
大家好,老胡又在博客和大家见面了,在聊今天的主角之前,老胡先给大家讲一个以前发生的故事. 真实的故事 当老胡还是小胡的时候,跟随团队一起开发一款游戏.这款游戏是一款末日生存类游戏,玩家可以 收集资 ...
- (二十一)状态模式详解(DOTA版)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本次LZ给各位介绍状态模式, ...
- State Pattern -- 状态模式原理及实现(C++)
主要参考<大话设计模式>和<设计模式:可复用面向对象软件的基础>两本书.本文介绍命令模式的实现. 问题出发点 在实际开发中,我们经常会遇到这种情况:一个对象有多种状态,在每一个 ...
- javascript设计模式学习之十六——状态模式
一.状态模式的定义 状态模式的关键是区分事务内部和外部的状态,事务内部状态改变往往会带来事务的行为改变. 状态模式中有意思的一点是,一般我们谈到封装,都是优先封装对象的行为,而非对象的状态.但在状态模 ...
- [设计模式] 20 状态模式 State Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对状态模式是这样说的:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.状态模式的重点在于状态转换,很多时候,对 ...
- C++设计模式之状态模式(四)
4.状态模式总结 状态模式将一个对象在不同状态下的不同行为封装在一个个状态类中,通过设置不同的状态对象能够让环境对象拥有不同的行为.而状态转换的细节对于client而言是透明的.client不直接操作 ...
- 折腾Java设计模式之状态模式
原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...
- C++设计模式——状态模式
前言 在实际开发中,我们经常会遇到这种情况:一个对象有多种状态,在每一个状态下,都会有不同的行为.那么在代码中我们经常是这样实现的. typedef enum tagState { state, st ...
- JavaScript状态模式及状态机模型
这是一篇,我自己都看不完的文章... 文章大体就两部分: 状态模式的介绍 状态机模型的函数库javascript-state-machine的用法和源码解析 场景及问题背景: 我们平时开发时本质上就是 ...
随机推荐
- 学会使用Fidder抓取app的http请求(转)
fidder可以抓取http请求,抓取手机app上面的,自己pc的请求也可以截取,通过这样达到类似浏览器调试的效果,更容易找到问题. 使用原文链接:http://www.cnblogs.com/syf ...
- currentTarget,this,target区别
currentTarget : 事件处理程序当前正在处理事件的那个元素 this : 当前的事件发生的元素 target : 事件的目标 currentTarget和this值是始终相等的,但是ta ...
- 关于Gradle2.0的翻译说明
Gradle1.12的翻译情况 Gradle实际上在4月16日就已经在对应的OmegaT项目上完成了翻译,后因项目繁忙,直到7月20日才完成了Github上Gradledoc项目及七牛站点的更新. 总 ...
- 从JDK源码角度看Object
Java的Object是所有其他类的父类,从继承的层次来看它就是最顶层根,所以它也是唯一一个没有父类的类.它包含了对象常用的一些方法,比如getClass.hashCode.equals.clone. ...
- rabbitMQ高可用
镜像模式 镜像模式和普通模式的区别就是,队列的数据都镜像了一份到所有的节点上.这样任何一个节点失效,不会影响整个集群的使用. 在实现上,mirror queue内部有一套选举算法,会选出一个maste ...
- 为网站添加favicon.ico图标
前言 貌似每次都是等到网站快收尾时才做favicon.ico的,这次也不例外.这年代…… 步骤 1.PS制作正方形图标,格式为jpg.jpeg.gif或png. 2.将图标转换为ICO格式,网上有很多 ...
- 在 Visual Studio中 使用Apache Cordova 开发安卓、iOS程序(自定义图标和闪屏)
方法1 1台安装有linux的电脑,虚拟机也行,并安装imagemagick软件包.我用的是linux mint,直接在软件管理器中安装即可 把https://github.com/shamork/c ...
- SmartSql 动态仓储
动态代理仓储 SmartSql源码:https://github.com/Ahoo-Wang/SmartSql 简介 动态代理仓储(SmartSql.DyRepository)组件是SmartSql非 ...
- IOS Number 处理(int-->NSNumber,NSNumber-->nsinteger,string -->double,CGFloat --> dobule)
1 小结: 1)int-->NSNumber:numberWithInt 2)NSNumber-->nsinteger:integerValue 3)string -->double ...
- 51nod 1118 机器人走方格
M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果. 收起 输入 第1行,2个数M,N,中间用空格隔开 ...