MapReduce1工作机制:
工作角色:客户端、jobtracker(协调作业)、tasktracker(执行任务)。
提交资源:
- 客户端启动一个job。
- 客户端向jobtracker请求一个新作业,检查作业输出路径是否存在,存在则抛出异常。随后,jobtracker向客户端返回一个作业ID和资源提交路径。
- 客户端将job所需资源(jar文件、xml文件、分片信息等)提交到指定路径(一般是HDFS共享文件系统)。
- 客户端向jobtracker提交job。
作业调度:
- jobtracker将提交的job放入内部的任务队列,作业调度器进行调度,初始化作业。(创建一个表示正在运行作业的对象,用来封装任务和记录信息。)
- jobtracker的作业调度器从hdfs共享文件系统中获取客户端分片信息,创建任务执行任务列表。(map任务、reduce任务、作业清理任务等)
- 多个tasktracker通过心跳与jobtracker进行通信,分配任务,报告是否准备接受任务,若准备好,则jobtracker分配任务给tasktracker。
运行任务:
- tasktracker在共享文件系统中获取任务信息,实现jar文件本地化,将jar解压到工作目录,创建TaskRunner实例。
- TaskRunner启动一个新的JVM。
- 运行map/reduce。
- 状态更新:tasktracker向jobtracker通过心跳发送状态,jobtracker合并后发给客户端。
MapReduce2 YARN工作机制:
工作角色:客户端、resource manager、MRAppMaster、node manager。
- 客户端启动一个job。
- 客户端向jobtracker请求一个新作业,随后,resource manager向客户端返回一个作业ID和资源提交路径。
- 客户端将job所需资源(jar文件、xml文件、分片信息等)提交到指定路径(一般是HDFS共享文件系统)。
- 客户端向jobtracker提交job。
- resource manager通过作业调度器在node manager上创建一个容器,容器中启动MRAppMaster进程(这个进程由resource manager启动)。
- MRAppMaster对作业进行初始化,创建多个对象进行跟踪。
- MRAppMaster获取分片信息,每个分片创建map任务和指定的reduce任务。若作业很小,会与MRAppMaster在同一个JVM上运行(少于10个mapper且只有一个reducer输出大小小于一个hdfs块,则作为uber任务运行)。
- 若作业很大,MRAppMaster为所有map和reduce申请容器资源。请求包括map数据本地化信息和输入分片信息等。
- 容器分配好之后,MRAppMaster通过与node manager通信启动容器,由MRAppMaster负责分配在哪些node manager上运行map和reduce任务(YarnChilde进程)。
- node manager获取job相关资源。
- 运行map和reduce任务。
- 状态更新:任务状态周期性向MRAppMaster汇报,客户端定期查询MRAppMaster获取任务状态。