版权声明:原创文章,谢绝转载 https://blog.csdn.net/m0_37367424/article/details/84031578
MapReduce作业运行机制
总结自Hadoop权威指南一书
作业运行机制中涉及到的实体
- 客户端:主要任务是提交作业,下简称CLI
- YARN资源管理器:负责协调集群资源,即ResourceManager,下简称RM
- YARN节点管理器:负责启动和监视机器上的计算容器,即NodeManager,下简称NM
- Mapreduce的Application master:负责协调运行MapReduce任务,其和应用运行于容器中,容器由ResourceManager分配,并由NodeManager管理。下简称AM
- 分布式文件系统:共享作业文件
作业运行
Job实例调用
submit()
方法后。submit()
内部会调用waitForCompletion()
作业提交
- CLI提交作业
- CLI向RM请求一个新应用ID作为MR作业ID。
- 检查作业输出说明。若未指定输出目录或输出目录已经存在,则作业不提交,抛回异常至MR作业
- 计算作业输入分片,若计算失败,则回抛异常。
- 将运行作业所需资源存至以ID命名的文件系统中。其中作业JAR会保存多份副本。
- CLI调用RM的
submitApplication()
方法提交作业
作业的初始化
- YARN 调度器分配一个容器
- RM在NM管理下在容器中启动AM进程
- AM初始化MR作业
- AM判断该作业的运行方式。如果AM判断在新的容器中分配和运行任务的开销大于并行运行他们的开销是很小,就选择与自己在同一个JVM上运行作业,然后从共享文件系统为每一个分片创建map任务,创建reduce任务对象,然后分配任务ID。这样的作业称为uberized,或作为uber作业运行1。
- 若作业不是uber作业,则进行任务分配,详见任务的分配
- AM设置OutputCommitter,默认为FileOutputCommitter,表示将建立作业的最终输出目录及任务输出的临时工作空间。
作业的分配
- AM为所有map任务和reduce任务向RM请求容器。请求时先为map任务请求,在5%的map任务完成后为reduce任务请求2。
- RM为任务分配一个特定节点上的容器。
任务的执行
- AM与NM(所分配节点的NM,可能于AM位于同一节点也可能不同)通信,由NM启动容器。
- 本地化运行所需要的资源,包含作业配置,JAR文件等
- 运行map或reduce任务。由主类
YarnChild
运行。3
streaming作业的运行
- java进程(属于hadoop)将输入键值传递给外部进程4
- 外部进程执行完处理逻辑将输出键值传递给java进程
任务进度及状态的更新
进度
- 对于map任务而言,任务进度是其已处理输入所占的比例。
- reduce比较复杂,其进度包含reducer 三部分,与shuffle的三个阶段相对应。5
状态
- 一个作业和他的每个任务都有一个状态,包含作业或任务的状态,map和reduce的进度,作业计数器的值,状态消息或状态描述。
- 任务计数器要么内置于框架(比如输出后统计map个数),要么用户自定义。
- 子进程向任务AM报告每隔3s报告进度和状态,由AM形成汇聚视图。
- 在作业期间,CLI每秒轮询一次AM以接受最新状态,也可以通过Job.getStatus方法得到JobStatus实例,后者包含作业全部作业信息。
作业的完成
- 当AM收到作业最后一个作业完成后,将作业状态置为成成功。
- CLI轮询得知作业成果
- Job打印消息通知用户。
- AM和任务容器清理其工作状态
- 存档作业历史服务器信息
小作业即作业是小于10个Map且只有一个Reduce且输入大小小于一个HDFS块的作业,启动小作业必须明确确认。 ↩︎
分配任务时,map具有数据本地化限制,reduce可在节点任意位置运行。前者优先级高于后者。 ↩︎
每个任务皆有搭建(setup)及提交(commit),由
OutputCommitter
确定,对于基于文件的作业,提交动作将任务输出由临时位置搬迁至最终位置。 ↩︎指MR实现逻辑,可能有各种语言实现 ↩︎
例如任务已经执行reducer一半的输入,则其进度为5/6,因为已经完成shuffle复制及排序阶段(每个1/3),并且完成reduce阶段的一半(1/6),其进度为5/6。 ↩︎