Hadoop-MapReduce的工作机制

来源:互联网 发布:关节机器人编程 编辑:程序博客网 时间:2024/06/04 20:03

MapReduce涉及到的实体

客户端
Jobtracker
TaskTracker
HDFS

MapReduce的执行流程

1.提交作业
1)从JobTracker获取JobId
2)检查相关路径
3)计算作业的输入分片
4)将运行作业所需要jar包复制到HDFS上
5)正式向JobTracker提交运行申请

2.初始化作业
1)读取hdfs上的分片信息,为生成InputSplit做准备
2)根据分片数初始化map任务数
3)根据配置的reduce任务个数创建reduce任务
4)根据分片的起始位置分布初始化好一个map任务和一个reduce任务

3.分片任务
1)TaskTracker获取自身状态,根据状态判断是否向JobTracker申请新任务
2)JobTracker接收到TaskTracker提交的心跳信息
3)如果TaskTracker在申请一个新的Task,JobTracker会封装一个任务发给TaskTracker

4.执行任务
TaskTracker接收到JobTracker返回的任务后就准备执行这个任务。
1)拷贝输入分片到本地(JobTracker会尽可能保证对map任务的数据本地化,减少网络数据传输)
2)拷贝task jar到本地
3)创建本地目录解压 task jar
4)启动新的jvm运行task
5)更新任务执行的进度和状态

7)完成作业

故障处理

硬件故障
JobTracker节点硬件故障:由于JobTracker在整个集群上是单点状态,所有没有比较好的办法来处理,也可以提供多个备用的JobTracker来尽量减少
整个集群的不可用时间

TaskTracker硬件故障:由于JobTracker和TaskTracker之间通过心跳确定状态,当TaskTracker长时间没有心跳请求时,JobTracker会将该节点从task列表中移除,
然后将该节点上未完成的map和reduce任务重新分配到其他节点重新运行。

任务失败
对于map或reduce任务出现异常而退出的情况,TaskTracker会将任务异常写入日志,然后将task槽位+1,并通过心跳向JobTracker报告任务失败,在JobTracker上回重置这个失败的任务的状态,然后尝试重新分配这个任务到TaskTracker,默认下,如果连续失败4次,那么整个任务就失败了。

作业调度机制

FIFO调度:单用户独占调度算法,集群资源不能同时服务于多个任务
公平调度:集群可同时服务于多个任务,切换单位为cpu时间片
容量调度:

Shuffle的过程

Map端Shuffle:
1)将map输出到内存缓冲区
2)当缓冲区达到阈值时,会将缓冲区中的内容划分到磁盘中
此时缓冲区仍然接收数据,如果写出速度小于写入速度造成缓冲区满,那么写入会等待写出完成。在写入磁盘前,会根据key对要写入的数据进行排序,如果用配置了combiner函数,那么还会调用combiner来进一步合并map输出,然后写入磁盘

3)当map任务完成时,TaskTracker会对产生的spill文件进行合并,在合并时,会根据分区信息从spill中抽取对应分区的数据并重新排序,以便于reduce进行处理。

Reduce端Shuffle:
1)复制Map输出:将map的计算结果复制到本地,如果文件比较小则会放到内存中
2)排序合并:对多个map的输出合并,并维持原有的顺序
3)处理

任务的执行

1.推测执行
当有任务执行缓慢时,JobTracker会重新启动一个相同的任务,如果有一个执行成功就把另一个kill掉。这也是为了防止某个任务过慢给整体任务的执行带来瓶颈。
单这种方式有一个弊端,就是当这种缓慢是由代码缺陷造成的时,会在集群中启动大类的相同任务,而实际并不会解决问题。

2.JVM重用
由于TaskTracker上的每个任务都会启动一个JVM,对于小型任务来说,可以服用启动的jvm,在前一个任务结束时,将新任务分配待这个jvm上,这样就避免的启动jvm
带来的性能消耗

3.跳过坏记录

0 0
原创粉丝点击