• (1)MapReduce 是一种分布式计算框架,由 Google 提出,主要用于搜索领域,以解决海量数据的计算问题。(分布式存储和分布式计算发轫于 Google 这样的公司是不足为奇的)
  • (2)MapReduce 由两个阶段组成:Map (开始)和 Reduce(结束),用户只需实现 map() 和 reduce() 两个函数,即可实现分布式计算,十分便捷
    输入文件来自于:HDFS
  • (3)这两个函数的形参是 key、value,表示函数的输入信息。

执行流程



Ubuntu的MapReduce实验 mapreduce实现方式_任务处理



  • (1)JobTracker 接受用户提交的计算任务,然后将计算任务分配给 TaskTracker 去执行
    计算任务 ⇒ JobTracker ⇒ TaskTracker
  • (2)Mapper 的输出作为 Reducer 的输入
    整个计算任务,整个的输入就是Map的输入,整个的输出就是Reduce的输出
  • (3)Mapper 任务 Reducer 任务分别都是 Java 进程,并不神秘,在一个 TaskTracker 上可能跑一个 Mapper 任务,也可能跑多个,甚至有可能 Mapper 任务和 Reducer 任务是在同一台机器上跑的,比如伪分布模式就只有一个 TaskTracker。



Ubuntu的MapReduce实验 mapreduce实现方式_分布式计算_02



  • (1)Mappers must complete before Reducers can begin.
    Mappers 完成以后,Reducers 才能执行,巧妇难为无米之炊;
  • (2)由 Mapper、Shuffle、Reducer 可知,其实一个 Reducer 接受的是全部 Mapper 的输出
  • (3)一个 Mapper 输出的分支数量与 Reducer 的任务数量是相同的

具体的执行步骤

第一阶段:map 任务处理

  • (1)读取输入文件内容,解析成 key、value 对(pair-wise,[K1, V1])。将输入文件的每一行,解析成 key、value 对,每一个键值对调用一次 map 函数。
  • (2)写自己的逻辑(覆盖map函数,写自己的逻辑),对输入的 key、value 处理,转换为新的 key、value 输出([K2, V2]),
  • (3)对输出的 key、value 进行分区(图2所示的,每一个Mapper Task 任务的三个分支就代表三个分区,每个分支表示一个分区),
  • (4)对不同分区的数据,按照 key 进行排序(说明 key 实现了comparable 接口,实现了 compareTo方法)、分组(把相同 key 的 value 放到一个集合中,[K2, {V2, …}]
    [K2, V2] ⇒ [K2, {V2 … }]
  • (5)(optional) 分组后的数据进行规约、

第二阶段:Reduce 任务处理

  • (1)对多个map任务的输出,按照不同的分区([K2, {V2, …}]),通过网络 copy 到不同的 reduce 节点(Mapper 任务和Reducer 任务在生产环节中一般不在同一个节点上)。
  • (2)对多个 Map 任务的输出进行合并、排序(每个Map任务已排好序,但多个任务之间并未排好序)。覆盖 reduce 函数,实现自己的逻辑,对输入的 key、value 进行处理,转换成新的 key、value 输出([K3, V3])。
    [K2, {Vs}] ⇒ [K3, V3](是将 key 和 values构成的集合,而不是一个个的键值对)(也是框架的工作
  • (3)把 reduce 的输出保存到文件

总结

  1. 构造[K1, V1]
  2. Map:[K1, V1] ⇒ [K2, V2]
  3. 分区
  4. 分组:[K2, V2] ⇒ [K2, {Vs}](将相同 key 的 values 置于一个集合中)
  5. 规约
  6. copy 到节点,排序
  7. Reduce:[K2, {Vs}] ⇒ [K3, V3]
  8. 保存