您的位置:首页 > 其它

MapReduce 原理及执行过程

2016-03-15 08:38 246 查看
(1)MapReduce 是一种分布式计算框架,由 Google 提出,主要用于搜索领域,以解决海量数据的计算问题。(分布式存储和分布式计算发轫于 Google 这样的公司是不足为奇的)

(2)MapReduce 由两个阶段组成:Map (开始)和 Reduce(结束),用户只需实现 map() 和 reduce() 两个函数,即可实现分布式计算,十分便捷

输入文件来自于:HDFS

(3)这两个函数的形参是 key、value,表示函数的输入信息。

执行流程



(1)JobTracker 接受用户提交的计算任务,然后将计算任务分配给 TaskTracker 去执行

计算任务 ⇒ JobTracker ⇒ TaskTracker

(2)Mapper 的输出作为 Reducer 的输入

整个计算任务,整个的输入就是Map的输入,整个的输出就是Reduce的输出

(3)Mapper 任务 Reducer 任务分别都是 Java 进程,并不神秘,在一个 TaskTracker 上可能跑一个 Mapper 任务,也可能跑多个,甚至有可能 Mapper 任务和 Reducer 任务是在同一台机器上跑的,比如伪分布模式就只有一个 TaskTracker。



(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 的输出保存到文件

总结

构造[K1, V1]

Map:[K1, V1] ⇒ [K2, V2]

分区

分组:[K2, V2] ⇒ [K2, {Vs}](将相同 key 的 values 置于一个集合中)

规约

copy 到节点,排序

Reduce:[K2, {Vs}] ⇒ [K3, V3]

保存
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: