`
brandNewUser
  • 浏览: 456929 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

combiner中使用状态模式

阅读更多

 

mapreduce中的combine过程

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

 

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

 

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

  

Combiner函数可能会在mapmerge操作完成之前,也可能在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端输出的结果,分成几种类型,其中MapResultElementMap端输出的单条记录;其余两种类型分别对应状态对象的输出结果。

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

 

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

 

 

 

 

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

 

 

 

  • 大小: 193.1 KB
  • 大小: 43.5 KB
  • 大小: 78.3 KB
分享到:
评论

相关推荐

    swift-使用GitHubAPI由SwiftUIFlux和Combine框架构建的示例iOS项目

    7. **状态管理**: 使用Flux和Combine,项目实现了高效的状态管理。Flux确保了单一数据流向,而Combine提供了事件处理和响应式编程的能力,使得应用在处理复杂的用户交互和数据流时依然保持清晰和可维护。 8. **...

    swift砖块系列:基于Alamofire5的Combine封装,更加快捷的发起网络请求,支持SwiftUI.zip

    打开`SwiftMesh`项目,查看源码,你可以看到具体的封装方式和如何在SwiftUI中使用这个封装好的网络请求。 总之,通过Alamofire5与Combine的结合,我们可以在SwiftUI项目中更优雅地处理网络请求。这种封装方式不仅...

    SwiftUI 与 Combine.zip

    此外,SwiftUI的绑定(Bindings)功能与Combine的发布者/订阅者模式相结合,可以轻松地将数据模型与用户界面绑定,实现双向数据流。 书中可能会详细解释以下知识点: 1. SwiftUI的基本组件和视图构造,如Text、...

    高清彩版 Combine_Asynchronous_Programming_with_Swift_5.1_v1.0.0.pdf

    - 在SwiftUI中使用Combine处理视图状态的变化。 - 实现视图与模型之间的双向数据绑定。 #### 4.2 错误处理(Error Handling) - 处理来自发布者的错误。 - 自定义错误类型和错误恢复策略。 #### 4.3 调度器...

    Combine Asynchronous Programming with Swift v0.3.0.zip

    5. **状态管理(State Management)**: SwiftUI与Combine结合,允许开发者通过`.environmentObject`或`.observedObject`来管理视图的状态。发布者可以将数据绑定到UI,当数据改变时,视图会自动更新。 6. **错误...

    IOS 观察者模式实例Demo

    使用`[NSNotificationCenter defaultCenter]`获取全局的通知中心,它是观察者模式中的主题。 2. 注册观察者(Observer): 使用`addObserver:selector:name:object:`方法将观察者(通常是控制器或任何需要监听...

    combine.zip

    当RTC的中断事件发生时,系统可以从Standby模式中唤醒。这种模式在需要长时间待机并定期进行特定操作的应用中非常有用,例如传感器监控或定时开关控制。 Keil5是一款流行的嵌入式开发环境,它提供了用于编写、编译...

    thinking-in-swiftui&SwiftUI 与 Combine编程

    SwiftUI和Combine是苹果在iOS开发中的两个重要框架,它们为开发者提供了强大的界面设计和事件处理能力。这两本书籍——"SwiftUI 与 Combine编程"和"swiftui 编想 (thinking-in-swiftui)"——旨在帮助iOS前端开发人员...

    iOS 设计模式 -单例

    在iOS开发中,设计模式是解决常见编程问题的模板,为代码组织提供了标准结构。其中,单例模式是一种被广泛...同时,随着Swift的 Combine 框架和轻量级依赖注入的流行,有些情况下可以考虑使用其他设计模式来替代单例。

    ModernMVVM:使用MVVM架构,Combine和SwiftUI框架构建的电影iOS应用https

    与该项目有关的文章。现代MVVM 一个示例项目演示了使用MVVM架构模式,Combine和SwiftUI框架构建iOS应用的现代方法。 该应用程序遵循单向数据流,并显示如何使用将UI表示为React性有限状态机。

    swift-Nocturnal是一个简单的macOS应用可一键切换黑暗模式

    在本项目"swift-Nocturnal"中,我们将探讨一个基于Swift的简单macOS应用——Nocturnal,它允许用户快速切换到系统黑暗模式,提升夜间或低光环境下的使用体验。 Nocturnal的设计理念是简洁易用,通过一键操作就能...

    收获::sheaf_of_rice:收获:受Elm启发的Apple的Combine.framework + State Machine

    5. **如何结合使用Combine与状态机**:将Combine与状态机结合,可以构建出高度模块化和可预测的应用状态管理。状态机定义了应用状态的生命周期,而Combine则负责事件的发布和订阅,使得状态的变化可以被订阅者监听并...

    iOS计算器源码MVVM设计模式.zip

    ViewModel会更新其内部状态,并通过KVO(Key-Value Observing)或者Swift的 Combine 框架通知View进行界面更新。此外,ViewModel可能还包含一些辅助方法,如检查输入的合法性、处理优先级等。 3. 算法实现: ...

    combine-bloc:使用Combine for SwiftUI构建的BLoC(业务逻辑组件)的初稿

    联合集团使用Apple的Combine框架实现“ BLoC”设计模式(业务逻辑组件)。 BLoC设计模式最初是为了帮助将表示与业务逻辑分开而设计的,因此,由于Blocs应该与平台无关,因此还增加了代码重用。 关键点是: 输入和...

    swift-仿知乎日报iOS客户端有夜间模式

    为了协调视图和视图模型之间的状态,开发者可能会使用RxSwift或Combine框架来实现响应式编程。这有助于在夜间模式切换时,实时更新UI和其他依赖于此状态的部分。 6. **UserDefaults**: 为了保存用户的夜间模式...

    Fluxor:基于Combine Swift的Swift Uni中的单向数据流

    Fluxor的出现,使得SwiftUI应用的状态管理变得简单且有条理,它遵循了Redux的模式,结合了Swift的Combine框架,为开发者提供了一套强大的工具,以应对日益复杂的应用状态管理需求。通过以上介绍,你应该对Fluxor有了...

    swift-MovieSwiftUI是一个基于MovieDBAPI使用SwiftUI构建的App

    最后,项目中提到的Flux(Redux)设计模式是一种前端架构模式,旨在解决大型应用中的状态管理问题。在SwiftUI环境中,开发者可以自定义实现这种模式,创建一个中央仓库来存储应用状态,并通过Action和Reducer来管理...

    iOS利用Bloc传值

    在iOS开发中,Bloc(Business Logic ...实践过程中,你将学习到如何定义事件和状态,创建Bloc,以及如何在视图控制器中使用Bloc。理解并熟练运用Bloc,将使你的代码结构更加清晰,提高代码的可读性和可维护性。

    RxSwift MVVM 设计模式结合实践,很值得参考.zip

    8. **Combine Framework**:虽然项目中使用的是RxSwift,但Apple的Combine框架也提供了类似的功能。了解这两者之间的对比和选择也是学习的一部分。 通过深入研究这个RxTodo项目,你不仅可以学习到RxSwift和MVVM的...

Global site tag (gtag.js) - Google Analytics