前言
本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系
正文
MapReduce 编程模型
MapReduce 提供了一个高度抽象化的编程模型,它的思想就是“分而治之”。
用户只需要继承 Mapper 和 Reducer 类就可以完成分布式编程,它极大地方便了编程人员在不会分布式并行编程的情况下,将程序运行在分布式系统上。
- Mapper 负责切分,即把复杂的任务分解为若干个简单,耦合度低,且可以并行计算的子任务来处理。
通过分解后,每个子任务的数据和计算规模都不太大,本着“数据不动,计算动”的原则,这些子任务通常会分配到数据所在的节点上运行。 - Reducer 负责对 Map 阶段的结果进行汇总,并将最终结果输出 HDFS 。
具体的编程实例可以参考我的这篇博客——MapReduce 编程不可怕,一篇文章搞定它
map() 函数
map() 函数以 key / value 对作为输入,产生另外一系列 key / value 对作为中间输出写入本地磁盘。
MapReduce 框架会自动将这些中间数据按照 key 值进行聚集,且 key 值相同(用户可设定聚集策略,默认情况下是对 key 值进行哈希取模)的数据被统一交给 reduce() 函数处理。
reduce() 函数
reduce()函数以 key 及对应的 value 列表作为输入,经合并 key 相同的 value 值后,产生另外一系列 key / value 对作为最终输出写入 HDFS 。
两阶段对比
Map 阶段
由一定数量的 MapTask 组成
输入数据格式解析: InputFormat (把输入文件进行分片)
输入数据处理: Mapper
数据分组: Partitioner
Reduce 阶段
由一定数量的 ReduceTask 组成数据远程拷贝(从 MapTask 的输出拷贝部分数据)
数据按照 key 排序和分组( key 相同的都挨在一起,按照 key 进行分组操作,每一组交由 Reduce 进行处理)
处理处理: Reduce
数据输出格式: OutputFormat (输出文件格式,分隔符等的设置)
编程模型三步曲
- Input :一系列 k1/v1 对
- Map 和 Reduce : Map:(k1, v1) --> List (k2, v2), Reduce:(k2, List(v2) --> List(k3, v3)
其中: k2/v2 是中间结果对
- Output :一系列(k3,v3)对。