YARN运行机制

1、作业的提交

    Client提交Job,调用Job.submit()方法创建一个JobSubmitter实例,并调用其submitJobInternal()方法

     向RM请求一个新的应用ID,用于作业ID(步骤2);检查作业的输出说明,计算作业的输入分片,将运行作业所需要的资源(包括Jar包,配置文件,split信息)复制到以作业ID命名的目录下的共享文件系统下(步骤3)。作业Jar的副本较多(由mapreduce.client.submit.file.replication控制,默认值为10)

    调用RM的submitApplication()方法提交作业(步骤4)。

2、作业的初始化

    当RM收到调用它的submitApplication()消息后,便将请求传递给YARN调度器(scheduler),scheduler分配container,然后RM在该container内启动AM进程,由NM监控(步骤5)

    AM一个主类为MRAppMaster的Java应用程序,通过创建多个bookkeeping对象保持对作业进度的跟踪(步骤6)

    接下来接受来自共享文件系统的、在客户端计算好的输入split(步骤7),然后为每个输入split创建一个map任务,根据mapreduce.job.reduces创建Reduce任务对象。任务ID在此时分配。

    注意:

    AM必须决定如何运行构成MapReduce作业的各个任务。如果作业很小,就选择和自己在同一个JVM上运行任务。与在一个节点上顺序运行这些任务相比,当AM判断在新的container中分配和运行任务的开销大于并行运行它们的开销时,就会发生这一情况,即作为uber任务运行

扫描二维码关注公众号,回复: 3646764 查看本文章

    那么哪些作业是小作业?默认情况下,小作业就是少于10个mapper且只有一个reduce且输入大小小于一个HDFS块的作业。

3、任务分配

    如果作业不适合作为uber任务运行,那么AM就会为该作业中的map任务和reduce任务向RM请求container(步骤8)。

    首先为map任务发出请求,该请求优先级要高于reduce任务的请求,这是因为所有的map任务必须在reduce的排序阶段能够启动前完成。知道有5%的map任务已经完成时,为reduce任务的请求才会发出。

4、任务运行

一旦RM的调度器为任务分配了container后,AM就通过与NM通信来启动container(步骤9a)。任务由主类为YarnChild的一个Java应用程序执行。在运行任务之前,首先将该任务需要的资源本地化,包括作业配置、Jar包以及来自分布式缓存的所有文件(步骤10)。最后,运行map任务/reduce任务(步骤11)

5、进度和状态更新

    YARN中的任务将其进度和状态(包括counter)返回给AM,Client每秒(通过mapreduce.client.progressmonitor.pollinterval设置)轮询一次AM以接受最新状态

6、作业完成

除了向AM请求作业进度外,Client每5分钟(通过mapreduce.client.completion.pollinterval设置)都会通过调用waitForCompletion()来检查作业是否完成。

    当AM收到作业最后一个任务已完成的通知后,便把作业的状态设置为"成功"。

    最后,作业完成时,AM和container会清理工作状态,OutputCommitter的CommitJob()方法会被调用。作业信息由作业历史服务器存档,以便日后用户需要时可以查询。











猜你喜欢

转载自blog.csdn.net/HYN205/article/details/80712093