前言

本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系

正文

MapReduce 编程模型

MapReduce 提供了一个高度抽象化的编程模型,它的思想就是“分而治之”。

用户只需要继承 Mapper 和 Reducer 类就可以完成分布式编程,它极大地方便了编程人员在不会分布式并行编程的情况下,将程序运行在分布式系统上。

  1. Mapper 负责切分,即把复杂的任务分解为若干个简单,耦合度低,且可以并行计算的子任务来处理。
    通过分解后,每个子任务的数据和计算规模都不太大,本着“数据不动,计算动”的原则,这些子任务通常会分配到数据所在的节点上运行。
  2. 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 (输出文件格式,分隔符等的设置)

编程模型三步曲

  1. Input :一系列 k1/v1 对
  2. Map 和 Reduce : Map:(k1, v1) --> List (k2, v2), Reduce:(k2, List(v2) --> List(k3, v3)

其中: k2/v2 是中间结果对

  1. Output :一系列(k3,v3)对。
上一篇 下一篇