ResourceManager学习之Application,状态机管理
application管理
yarn中,application是指应用程序,他可能启动多个运行实例,每个运行实例由一个applicationmaster与一组该applicationmaster启动的任务组成,他拥有名称、队列名、优先级等属性,是一个比较宽泛的概念,可以是一个mapreduce作业、一个dag应用程序,设置可以是一个storm集群实例
(1) applicationaclsmanager
applicationaclsmanager负责管理应用程序的访问权限,包含两部分权限:查看权限和修改权限。其中,查看权限主要用于查看应用程序基本信息,比如运行时间、优先级等信息;而修改权限则主要用于修改应用程序优先级、杀死应用程序等。默认情况下,任意一个普通用户可以查看所有其他用户的应用程序。用户可以为自己的应用程序设置具有访问权限的用户列表,具体方法是在客户端使用containerlaunchcontext#newinstance构造containerlaunchcontext实例时将其作为参数传入。
通常而言,为了便于用户设置该参数,运行在yarn之上的计算框架会预留一些参数供用户提交应用程序时动态设置,比如mapreduce计算框架允许用户通过参数mapreduce.job.acl-view-job和mapreduce.job.acl-modify-job为每个应用程序设置查看和修改权限
(2) rmappmanager
rmappmanager负责应用程序的启动和关闭。clientrmservice收到来自客户端的提交应用程序请求后,将调用函数rmappmanager#submitapplication创建一个rmapp对象,它将维护这个应用程序的整个生命周期,从开始运行到最终结束;当rmapp运行结束后,将向rmappmanager发送一个rmappmanagereventtype.app_completed事件,他收到该事件后将调用rmarmappmanager#finishapplication进行收尾工作,包括 :
- 将该应用程序放入已完成应用程序列表中,以便用户查询历史应用程序运行信息。需要注意的是,该列表的大小是有限的,默认是10000(管理员可通过参数yarn.resourcemanager.max-completed-applications修改),当已完成应用程序数目超过该值时,将从内存数据结构中移除(移除的应用程序可称为"过期的应用程序"),这样用户只能通过history server获取过期的应用程序信息,history server是从磁盘文件中获取这些信息的
- 将应用程序从rmstatestore中移除。rmstatestore记录了运行中的应用程序的运行日志,当集群故障重启后,resourcemanager可通过这些日志恢复应用程序运行状态,从而避免全部重新运行,一旦应用程序运行结束后,这些日志便失去了意义,故可以对其进行删除。这属于resourcemanager容错机制的范畴
(3) containerallocationexpirer
当一个am获得一个container后,yarn不允许am长时间不对其使用,因为这会降低整个集群的利用率。当am收到rm新分配的一个container后,必须在一定的时间内在对应的nm上启动该container,否则rm将强制回收该container
状态机管理
yarn中,如果一个对象由若干个状态以及触发这些状态发生转移的事件构成,它将被抽象成一个状态机,在yarn resourcemanager内部,共有四类状态机,分别是rmapp,rmappattempt,rmcontainer和rmnode。其中,前2类状态机维护了一个应用程序相关的生命周期,包括application生命周期,一次进行尝试的生命周期;rmcontainer则维护了分配出去的各个资源的使用状态;rmnode维护了一个nodemanager的生命周期
yarn中的application生命周期由状态机rmappimpl维护,每个application可能会尝试运行多次,每次成为一次"运行尝试",而每次运行尝试的生命周期则由状态机rmappattemptimpl维护,如果一次运行尝试运行失败,rmapp会创建另外一个运行尝试,知道某次运行尝试运行成功或者达到运行尝试上限。对于每次运行尝试,resourcemanager将为它分配一个container,container是运行环境的抽象,内部封装了任务的运行环境和资源等信息,而一个应用程序的applicationmaster就运行在这个container中。applicationmaster启动之后,会不断向resourcemanager申请container以运行各类任务。container的生命周期由状态机rmcontainerimpl维护
application attempt的生命周期与applicationmaster的生命周期基本上是一致的 : 一个application内部所有任务均由applicationmaster维护和管理,applicationmaster本身需要占用一个container,而这个container由resourcemanager为其申请和启动。一旦applicationmaster成功启动,他就会与resourcemanager通信,为它内部的任务申请container。如果applicationmaster重新启动,则意味着一个新的application attempt被启动,换句话说,一个application attempt的"生死存亡"与applicationmaster的"命运"紧紧绑定在一起
我每天会写文章记录大数据技术学习之路,另外我自己整理了些大数据的学习资料,目前全部放在我的公众号"smallbird技术分享",加入我们一起学习交流,并且回复'分享'会有大数据资源惊喜等着你~
上一篇: navicat远程连接mysql错误
下一篇: yarn和npm的对比以及yarn的使用