一 背景
客户在使用我们的EMR产品时一天大概提交2000个appliaction,但是yarn的UI界面仅仅展示出了100多个历史application信息,影响了客户查阅历史信息。
二 源码分析
yarn提供的WEB界面可以展示历史application,如下图所示:
前端页面仅仅是展示application信息,application的详细信息 可以从RMContext中获取。RMContext的实现类RMContextImpl存储着所有Appliaction信息,但是存储Application的个数确实由RMAppManager控制。
RMAppManager在RM中的作用是管理所有application,比如通过submitApplication,finishApplication,recoverApplication提交,结束,恢复application。
RMApp是ResourceManager中用于维护一个Application生命周期的数据结构,它的实现是RMAppImpl,该类维护了一个Application状态机,记录了一个Application可能存在的各个状态以及导致状态间转换的事件。
针对application的个数,RMAppManager中有两个变量来控制这个数量,
DEFAULT_RM_MAX_COMPLETED_APPLICATIONS:由yarn.resourcemanager.max-completed-applications参数控制,其意义是:
DEFAULT_RM_STATE_STORE_MAX_COMPLETED_APPLICATIONS:由yarn.resourcemanager.state-store.max-completed-applications参数控制
(完成应用程序的最大数量的RM状态存储,默认情况下等于DEFAULT_RM_MAX_COMPLETED_APPLICATIONS,当第二个变量大于第一个变量时,在构造方法中maxCompletedAppsInMemory会被初始化等于maxCompletedAppsInStateStore。)
当一个APP完成时(KILLED, FINISHED,FAILED都属于完成状态),RMAppManager会调用如下方法:
该方法调用finishAppliaction去结束一个application的生命周期,必将app的个数记录起来,然后使用checkAppNumCompletedLimit方法检查app个数是否超过阈值,如果超过就将RMContext中存储的application剔除去一个。
三 总结
我们EMR配置的个数是150,DEFAULT_RM_MAX_COMPLETED_APPLICATIONS的默认值是10000。实际经验是这个值保留平均每天作业数的2到3倍就可以,就是保留数据2,3天。不然使用1w数据确实很大,前台显示缓慢也会给resourcemanager带来不必要的压力和性能瓶颈。