一、概述
MapReduce是一种分布式计算模型,由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce()两个函数,即可实现分布式计算。
这两个函数的形参是key、value对,表示函数的输入信息。
其中map(),输入键值对<k1,v1>,输出键值对<k2,v2>;
reduce(),输入键值对<k2,{v2}>,输出键值对<k3,v3>。
二、MapReduce原理
三、Map任务处理
1、读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成 key、value对。每一个键值对调用一次map函数。
2 、写自己的逻辑,处理输入的key、value,转换成新的key、value输出。
3 、对输出的key、value进行分区。
4 、对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。
5 、 (可选)分组后的数据进行归约。
四、Reduce任务处理
1、对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。
2 、对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
3 、把reduce的输出保存到HDFS文件中。
五、Map任务和Reduce任务举例
假如我们要做一个词频统计的任务,在HDFS中的words文件内容
YSL 17
纪梵希 303
香奈儿 46
YSL 12
YSL 14
Map输入这一步由MapReduce框架自动完成,
Reduce输入这一步由MapReduce框架自动完成,
六、MapReduce流程分析
1、过程各个角色的作用
jobClient:提交作业
JobTracker:初始化作业,分配作业,TaskTracker与其进行通信,协调监控整个作业
TaskTracker:定期与JobTracker通信,执行Map和Reduce任务
HDFS:保存作业的数据、配置、jar包、结果
2、作业提交流程
(1)提交作业准备:编写自己的MR程序; 配置作业,包括输入输出路径等等。
(2)提交作业:配置完成后,通过JobClient提交。
(3)具体功能:与JobTracker通信得到一个jar的存储路径和JobId,输入输出路径检查、将jobj ar拷贝到的HDFS。
3、作业初始化
客户端提交作业后,JobTracker会将作业加入到队列,然后进行调度,默认是FIFO方式。
具体功能:作业初始化主要是指JobInProgress中完成的。
读取分片信息。创建task包括Map和Reduce任创建task包括Map和Reduce任务。
创建TaskInProgress执行task,包括map任务和reduce任务。
4、任务分配
TaskTracker与JobTracker之间的通信和任务分配是通过心跳机制实现的
TaskTracker会主动定期向JobTracker发送报告,询问是否有任务要做,如果有,就会申请到任务。
5、任务执行
如果TaskTracker拿到任务,会将所有信息拷贝到本地,包括代码、配置、分片信息等。
TaskTracker中的localizeJob()方法会被调用进行本地化,拷贝job.jar,jobconf,job.xml到本地。
TaskTracker调用launchTaskForJob()方法加载启动任务。
MapTaskRunner和ReduceTaskRunner分别启动java child进程来执行相应的任务。
6、错误处理
a、JobTracker失败
存在单点故障,hadoop2.0解决了这个问题
b、TraskTracker失败
TraskTracker崩溃了会停止向JobTracker发送心跳信息。
JobTracker会将TraskTracker从等待的任务池中移除,并将该任务转移到其他的地方执行
JobTracker将TaskTracker加入到黑名单中
c、Task失败
任务失败,会向TraskTracker抛出异常,最后任务挂起