一、MapReduce执行过程
1、提交作业
- 向资源管理器(RecourceManager)申请一个新应用的ID。
- 检查作业的输出。没有指定目录或目录不存在则抛出错误。
- 检查作业的输入分片。检查输入路径并计算分片,如果计算不出分片,则抛出错误。
- 共享应用和任务资源文件。将应用jar包,其他文件上传到HDFS。
- 启动submitApplicition(),提交作业
2、作业的初始化
- 资源管理器接收到submitApplicition()后,启动容器以运行applicitionMaster。
- 本地化任务资源,下载HDFS上的共享文件。
- applicitionMaster自主决定是否只在本机运行还是启动其他节点。
3、任务的分配
- 当步骤2.3启动其他节点时,为map和reduce向RecourceManager申请资源。
- 同时也为任务指定CPU资源和内存资源。
4、任务的执行
- 资源管理器分配容器资源后,applicitionMaster远程RPC通信启动容器。
- 本地化任务资源,下载HDFS上的共享文件。
- YarnChild在特定JVM中运行map任务和reduce任务。(运行在JVM中的好处是map、reduce中的错误不会影响到节点管理器)
5、任务状态和进度的更新
- applicitionMaster与map、reduce进程通信,询问状态和进度。
- 客户端向applicitionMaster程通信,询问状态和进度。
6、任务的成功
- 当applicitionMaster收到最后一个任务完成时,更新任务状态。
- applicitionMaster和容器清理工作状态,删除中间结果信息。
二、MapReduce执行失败
1、任务运行失败
- 如果map、reduce错误,则JVM向applicitionMaster报告错误并记录日志。
- 如果JVM错误,则NodeManager向applicitionMaster报告错误并记录日志。
2、ApplicitionMaster运行失败
- 定时心跳的RecourceManager发现applicitionMaster运行失败,则在新节点重启一个applicitionMaster,并根据历史作业恢复程序运行状态。
- 客户端在任务初始化时会记录applicitionMaster位置,当通信失败时重新向RecourceManager询问新的位置。
3、资源管理器运行失败
- 一般是用Zookeeper记录资源管理器的程序信息,当RecourceManager运行失败时,辅助RecourceManager会成为新的RecourceManager,并恢复Zookeeper中的程序信息和状态。
三、Shuffle过程
- map任务输出到环形缓冲空间中。(当到达80%后会溢写输出文件) —— MapOutput
- 在缓冲空间中,对数据进行分区,并对每个分区的数据进行排序。 —— partion and sort
- 如果存在combiner,则在排序后进行combiner。 —— combiner
- 将缓存中的数据新建为溢写文件。 —— spill to disk
- 由于map一直在输出,会产生多个溢写文件,将多个溢写文件(已经在磁盘上)进行合并为一个文件并将多个溢写文件按照分区后的数据再次排序。 —— merge on disk and sort
- reduce端拉取磁盘上的数据。 —— fetch
- 对多个输入到reduce上的文件进行合并并维持其顺序排序。 —— merge
- reduce输出到文件系统。 —— fileOutput