在 YARN 中,Application 是指应用程序,它可能启动多个运行实例,每个运行实例由 —个 ApplicationMaster 与一组该 ApplicationMaster 启动的任务组成,它拥有名称、队列、优先级等属性,是一个比较宽泛的概念,可以是一个 MepReduce 作业、一个 DAG 应用程序等。YARN 中 Application 管理涉及应用程序的权限管理、启动与关闭、生命周期管理等,本节只介绍最基本的管理内容,比如权限管理、启动与关闭等,而生命周期管理则放到下一节中介绍。

一、ApplicationACLsManager

ApplicationACLsManager 负责管理应用程序访问权限

  • 查看权限

    • 程序基本信息:运行时间、优先级等
  • 修改权限
    • 修改程序优先级、杀死应用程序

二、RMAppManager

RMAppManager 负责应用程序启动和关闭。接下来结合源码主要分析启动和结束两个操作。

1、启动

在「4-1 ResourceManager 功能概述」中,提到了 ClientRMService 处理来自客户端各种 RPC 请求,比如提交、终止获取应用运行状态等。

ClientRMService 当收到客户端提交的应用后,将调用函数 RMAppManager#submitApplication 创建一个 RMApp 对象,维护应用程序的整个生命周期。

protected void submitApplication() {
// 创建 app,并添加到 RMActiveServiceContext.applications
RMAppImpl application =
createAndPopulateNewRMApp(submissionContext, submitTime, user, false); // 发送 app start event,继续由其他事件处理器处理
this.rmContext.getDispatcher().getEventHandler()
.handle(new RMAppEvent(applicationId, RMAppEventType.START));
}

2、结束

当 RMAPP 运行结束后,将向 RMAPPManager 发送一个 RMAPPManagerEventType.APP_COMPLETED 事件。看源码将执行 3 个操作:

  public void handle(RMAppManagerEvent event) {
ApplicationId applicationId = event.getApplicationId();
LOG.debug("RMAppManager processing event for "
+ applicationId + " of type " + event.getType());
switch(event.getType()) {
case APP_COMPLETED:
{
finishApplication(applicationId);
logApplicationSummary(applicationId);
checkAppNumCompletedLimit();
}
  • finishApplication()

    • 将 Application 放入到内存的已完成列表 completedApps 中,用户可查询历史应用执行信息(如 yarn web)。
  • logApplicationSummary()
    • 打印日志信息。
  • checkAppNumCompletedLimit()
    • 上面提到的 completedApps 列表容量有限,默认 10000,可修改。超过该值时,将从在这里被移除,后续可从 History Server 中进行查看。
    • 将应用程序从 RMStateStore 中移除。RMStateStore 记录了运行中的应用程序的运行日志,当集群故障重启后,RM 可通过这些日志恢复应用程序运行状态,从而避免全部重新运行,一旦应用程序运行结束后,这些日志便失去了意义, 故可以对其进行删除。

三、ContainerAllocationExpirer

当 AM 获得 Container 后,必须在一定时间内(默认为 10min,可修改),在对应的 NM 上启动该 Container,否则 RM 将强制回收该 Container。因为 YARN 不允许 AM 长时间不对其使用,会降低整个集群的利用率。

protected void expire(AllocationExpirationInfo allocationExpirationInfo) {
dispatcher.handle(new ContainerExpiredSchedulerEvent(
allocationExpirationInfo.getContainerId(),
allocationExpirationInfo.isIncrease()));
}

该类也继承自抽象类 AbstractLivelinessMonitor,前面已经讲过,这里不再赘述。

最新文章

  1. split分割大文件--包含通过awk按规则分割文件到对应子文件
  2. SQL --Chapter 04 数据更新
  3. Android title和actionbar的区别
  4. css垂直水平居中方案
  5. Android执行shell命令
  6. PAT1122: Hamiltonian Cycle
  7. tkinter中text文本与scroll滚动条控件(五)
  8. Java的LockSupport.park()实现分析(转载)
  9. Quartz动态添加定时任务执行sql(服务启动添加+手动添加)
  10. 【转】HTML
  11. SQL Server--------SQL Server问题错误解决
  12. js 遍历
  13. JS从数组中随机取出几个数组元素的方法
  14. 【Eclipse】Eclipse 安装 SVN 插件的三种方法
  15. 使用VScode 的插件
  16. 欢迎来怼第二周Scrum会议六(总第十三次)
  17. Java 数组转字符
  18. 内核通信之Netlink源码分析-基础架构
  19. Notes of the scrum meeting before publishing(12.19)
  20. Codeforces 1109C 线段树

热门文章

  1. 2.RabbitMQ系列之生产者
  2. 算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
  3. Vue中、参数传递以及重定向
  4. 通过齐博fun函数实现调用每周赚取的积分排行使用
  5. 知识图谱-生物信息学-医学顶刊论文(Bioinformatics-2021)-KG4SL:用于人类癌症综合致死率预测的知识图神经网络
  6. LINQ使用小贴士
  7. 二十九、Helm常用命令
  8. NC-日志配置及代码详解
  9. django启动报错:DisallowedHost at /
  10. uboot引导应用程序