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中放置过多条件判断的替代方法。
相关推荐
7. **状态管理**: 使用Flux和Combine,项目实现了高效的状态管理。Flux确保了单一数据流向,而Combine提供了事件处理和响应式编程的能力,使得应用在处理复杂的用户交互和数据流时依然保持清晰和可维护。 8. **...
打开`SwiftMesh`项目,查看源码,你可以看到具体的封装方式和如何在SwiftUI中使用这个封装好的网络请求。 总之,通过Alamofire5与Combine的结合,我们可以在SwiftUI项目中更优雅地处理网络请求。这种封装方式不仅...
此外,SwiftUI的绑定(Bindings)功能与Combine的发布者/订阅者模式相结合,可以轻松地将数据模型与用户界面绑定,实现双向数据流。 书中可能会详细解释以下知识点: 1. SwiftUI的基本组件和视图构造,如Text、...
- 在SwiftUI中使用Combine处理视图状态的变化。 - 实现视图与模型之间的双向数据绑定。 #### 4.2 错误处理(Error Handling) - 处理来自发布者的错误。 - 自定义错误类型和错误恢复策略。 #### 4.3 调度器...
5. **状态管理(State Management)**: SwiftUI与Combine结合,允许开发者通过`.environmentObject`或`.observedObject`来管理视图的状态。发布者可以将数据绑定到UI,当数据改变时,视图会自动更新。 6. **错误...
使用`[NSNotificationCenter defaultCenter]`获取全局的通知中心,它是观察者模式中的主题。 2. 注册观察者(Observer): 使用`addObserver:selector:name:object:`方法将观察者(通常是控制器或任何需要监听...
当RTC的中断事件发生时,系统可以从Standby模式中唤醒。这种模式在需要长时间待机并定期进行特定操作的应用中非常有用,例如传感器监控或定时开关控制。 Keil5是一款流行的嵌入式开发环境,它提供了用于编写、编译...
SwiftUI和Combine是苹果在iOS开发中的两个重要框架,它们为开发者提供了强大的界面设计和事件处理能力。这两本书籍——"SwiftUI 与 Combine编程"和"swiftui 编想 (thinking-in-swiftui)"——旨在帮助iOS前端开发人员...
在iOS开发中,设计模式是解决常见编程问题的模板,为代码组织提供了标准结构。其中,单例模式是一种被广泛...同时,随着Swift的 Combine 框架和轻量级依赖注入的流行,有些情况下可以考虑使用其他设计模式来替代单例。
与该项目有关的文章。现代MVVM 一个示例项目演示了使用MVVM架构模式,Combine和SwiftUI框架构建iOS应用的现代方法。 该应用程序遵循单向数据流,并显示如何使用将UI表示为React性有限状态机。
在本项目"swift-Nocturnal"中,我们将探讨一个基于Swift的简单macOS应用——Nocturnal,它允许用户快速切换到系统黑暗模式,提升夜间或低光环境下的使用体验。 Nocturnal的设计理念是简洁易用,通过一键操作就能...
5. **如何结合使用Combine与状态机**:将Combine与状态机结合,可以构建出高度模块化和可预测的应用状态管理。状态机定义了应用状态的生命周期,而Combine则负责事件的发布和订阅,使得状态的变化可以被订阅者监听并...
ViewModel会更新其内部状态,并通过KVO(Key-Value Observing)或者Swift的 Combine 框架通知View进行界面更新。此外,ViewModel可能还包含一些辅助方法,如检查输入的合法性、处理优先级等。 3. 算法实现: ...
联合集团使用Apple的Combine框架实现“ BLoC”设计模式(业务逻辑组件)。 BLoC设计模式最初是为了帮助将表示与业务逻辑分开而设计的,因此,由于Blocs应该与平台无关,因此还增加了代码重用。 关键点是: 输入和...
为了协调视图和视图模型之间的状态,开发者可能会使用RxSwift或Combine框架来实现响应式编程。这有助于在夜间模式切换时,实时更新UI和其他依赖于此状态的部分。 6. **UserDefaults**: 为了保存用户的夜间模式...
Fluxor的出现,使得SwiftUI应用的状态管理变得简单且有条理,它遵循了Redux的模式,结合了Swift的Combine框架,为开发者提供了一套强大的工具,以应对日益复杂的应用状态管理需求。通过以上介绍,你应该对Fluxor有了...
最后,项目中提到的Flux(Redux)设计模式是一种前端架构模式,旨在解决大型应用中的状态管理问题。在SwiftUI环境中,开发者可以自定义实现这种模式,创建一个中央仓库来存储应用状态,并通过Action和Reducer来管理...
在iOS开发中,Bloc(Business Logic ...实践过程中,你将学习到如何定义事件和状态,创建Bloc,以及如何在视图控制器中使用Bloc。理解并熟练运用Bloc,将使你的代码结构更加清晰,提高代码的可读性和可维护性。
8. **Combine Framework**:虽然项目中使用的是RxSwift,但Apple的Combine框架也提供了类似的功能。了解这两者之间的对比和选择也是学习的一部分。 通过深入研究这个RxTodo项目,你不仅可以学习到RxSwift和MVVM的...