MapReduce计算模型介绍

一、理解MapReduce思想

MapReduce思想在生活中处处可见。或多或少都曾接触过这种思想。
MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)。即使是发布过论文实现分布式计算的谷歌也只是实现了这种思想,而不是自己原创。
Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。
可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。
Reduce负责“合”,即对map阶段的结果进行全局汇总。

这两个阶段合起来正是MapReduce思想的体现。

还有一个比较形象的语言解释MapReducc:
我们要数图书馆中的所有书你数1号书架,我数2号书架。这就是“Map”我们人越多,数书就更快。
现在我们到一起,把所有人的统计数加在一起。这就是“Reduce”。

比如我们要统计一个文件中出现的单词的次数,
传统思想就是写一个Java程序去获取文件到本地,统计到的思路 要把文件的所有块拉取过来,然后统计。如果数据特别大,拉取数据就比较耗时。
如果我们采用分布式计算思想(MapReduce)明显效率会比较高。

在这里插入图片描述

二、深入理解MapReduce原理

MapReduce程序的执行流程图
在这里插入图片描述

由图我们可以看到, MapReduce存在以下4个独立的实体。

1. JobClient:运行于client node,负责将MapReduce程序打成Jar包存储到HDFS,并把Jar包的路径提交到Jobtracker,由Jobtracker进行任务的分配和监控。
2. JobTracker:运行于name node,负责接收JobClient提交的Job,调度Job的每一个子task运行于TaskTracker上,并监控它们,如果发现有失败的task就重新运行它。
3. TaskTracker:运行于data node,负责主动与JobTracker通信,接收作业,并直接执行每一个任务。
4. HDFS:用来与其它实体间共享作业文件。

各实体间通过以下过程完成一次MapReduce作业。

 1.JobClient通过RPC协议向JobTracker请求一个新应用的ID,用于MapReduce作业的ID    
2.JobTracker检查作业的输出说明。例如,如果没有指定输出目录或目录已存在,作业就不提交,错误抛回给JobClient,否则,返回新的作业ID给JobClient 
3.JobClient将作业所需的资源(包括作业JAR文件、配置文件和计算所得得输入分片)复制到以作业ID命名的HDFS文件夹中    
4.JobClient通过submitApplication()提交作业 JobTracker收到调用它的submitApplication()消息后,进行任务初始化 
5.JobTracker读取HDFS上的要处理的文件,开始计算输入分片,每一个分片对应一个TaskTracker 
6.TaskTracker通过心跳机制领取任务(任务的描述信息) 
7.TaskTracker读取HDFS上的作业资源(JAR包、配置文件等) 
8.TaskTracker启动一个java child子进程,用来执行具体的任务(MapperTask或ReducerTask) T
9.askTracker将Reduce结果写入到HDFS当中 

三、MapReduce工作原理

在这里插入图片描述

Map任务处理

1、 读取HDFS中的文件。每一行解析成一个<k,v>。每一个键值对调用一次map函数
2、重写map(),对第一步产生的<k,v>进行处理,转换为新的<k,v>输出
3、对输出的key、value进行分区
4、对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中
5、(可选) 对分组后的数据进行归约

Reduce任务处理

1、多个map任务的输出,按照不同的分区,通过网络复制到不同的reduce节点上
2、 对多个map的输出进行合并、排序。
3、重写reduce函数实现自己的逻辑,对输入的key、value处理,转换成新的key、value输出
4、 把reduce的输出保存到文件中

参考链接:https://www.jianshu.com/p/ca165beb305b

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章