YARN 工作流程
运行在 YARN 上的应用程序主要分为两类:短作业和长服务。
短作业是指一定时间内(可能是秒级、分钟级或小时级,尽管天级别或者更长时间的也存在,但非常少)可运行完成并退出的应用程序,比如 MapReduce 作业、Spark 作业等;
长服务是指不出意外,永不终止运行的应用程序,通常是一些在线服务,比如 Storm Servive(主要包括 Nimbus 和 Supervisor 两类服务)、HBase Service(包括 Hmaster 和 RegionServer 两类服务)等,而它们本身作为一个框架或服务提供了访问接口供用户使用。
尽管这两类应用程序作用不同,一类直接运行数据处理程序,一类用于部署服务(服务之上再运行数据处理程序),但运行在 YARN 上的流程是相同的。
当用户向 YARN 中提交一个应用程序后,YARN 将分两个阶段运行该应用程序:第一个阶段是启动 ApplicationMaster;第二个阶段是由 ApplicationMaster 创建应用程序,为它申请资源,并监控它的整个运行过程,直到运行成功。YARN 的工作流程分为以下几个步骤:
1)提交应用程序:用户通过客户端与 YARN ResourceManager 通信,以提交应用程序,应用程序中需包含 ApplicationMaster 可执行代码、启动命令和资源需求、应用程序可执行代码和资源需求、优先级、提交到的队列等信息。
2)启动 ApplicationMaster:ResourceManager 为该应用程序分配第一个 Container,并与对应的 NodeManager 通信,要求它在这个 Container 中启动应用程序的 ApplicationMaster,之后 ApplicationMaster 的生命周期直接被 ResourceManager 管理。
3)ApplicationMaster 注册:ApplicationMaster 启动后,首先,向 ResourceManager 注册,这样,用户可以直接通过 ResourceManage 查看应用程序的运行状态,然后,它将初始化应用程序,并按照一定的策略为内部任务申请资源,监控它们的运行状态,直到运行结束,即重复步骤 4~7。
4)资源获取:ApplicationMaster 采用轮询的方式通过 RPC 协议向 ResourceManager 申请和领取资源。
5)请求启动 Container:一旦 ApplicationMaster 申请到资源后,则与对应的 NodeManager 通信,请求为其启动任务(NodeManager 会将任务放到 Container 中)。
6)启动 Container:NodeManager 为任务设置好运行环境(包括环境变量、jar 包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过 ContainerExecutor 运行该脚本启动任务。
7)Container 监控:ApplicationMaster 可通过两种方式获取各个 Container 的运行状态,以便在任务失败时重新启动任务:
ApplicationMaster 与 ResourceManager 间维护了周期性心跳信息,每次通信可获取自己分管的 Container 的运行状态。
各个 Container 可通过某个 RPC 协议向 ApplicationMaster 汇报自己的状态和进度(视具体应用程序而定,比如 MapReduce 和 YARN 均实现了该方式)。
8)注销 ApplicationMaster:应用程序运行完成后,ApplicationMaster 向 ResourceManager 注销,并退出执行。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/0285b4e7ac868e527cacba2fc】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论