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 的任务数量是相同的
(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 的输出保存到文件
Map:[K1, V1] ⇒ [K2, V2]
分区
分组:[K2, V2] ⇒ [K2, {Vs}](将相同 key 的 values 置于一个集合中)
规约
copy 到节点,排序
Reduce:[K2, {Vs}] ⇒ [K3, V3]
保存
(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]
保存
相关文章推荐
- kafka
- SAP概念之利润中心
- 在页眉插入横线或下划线
- Java 序列化
- Ignite
- java @Override错误的解决办法
- 很实用的表单验证js
- DLL程序的创建步骤和測试程序
- HDU 1874 畅通工程续
- 自定义快速报表的打印预览窗口
- 高并发服务器的设计--架构与瓶颈的设计GOOD
- 进程与线程理解
- Bluemix结合DevOps Service实现一键部署
- 为什么说DOM很慢(二)
- 关于scanf的几种处理方法
- Arrayfire学习笔记(二)开始滑翔吧!
- 用JAX-WS在Tomcat中公布WebService
- 越学习越发觉自己的无知,越发觉无知越想学习。
- 流的存入读取
- 预习面向对象设计基础