前言
MapReduce框架使用Mapper将数据处理成一个个的<key, value>键值对,然后在网络节点间对其进行整理(shuffle),最后使用Reducer处理数据并输出。
分析
从上面的过程中,我们可以分析出两个性能瓶颈:
- 网络传输压力:比如我们有100亿条数据,Mapper就会生成100亿条键值对在网络间传输。如果我们只是对数据求最大值,那么很明显每一个Mapper只需要输出它所处理的数据中的最大值即可。这样不仅能减少网络传输压力,同时也能提升程序处理效率。
- 数据倾斜:如果Mapper处理的数据有着严重的数据倾斜问题,那么会导致大部分数据汇聚到一个reduce中处理,导致reduce处理效率低甚至崩溃等情况。
目的
MapReduce中的Combiner就是为了缓解Map任务和Reduce任务之间的数据传输问题的。MapReduce运行用户针对Map Task的输出设置一个合并函数来减少传输到reduce的数据,可以理解为map任务的本地reduce操作。
数据格式转换
- Mapper:(K1, V1)—> list(K2, V2)
- Combiner:(K2, list(V2)) —> list(K3, V3)
- Reducer:(K3, list(V3))—> list(K