zoukankan      html  css  js  c++  java
  • Yarn中的几种状态机

    1 概述

        为了增大并发性,Yarn採用事件驱动的并发模型。将各种处理逻辑抽象成事件和调度器。将事件的处理过程用状态机表示。什么是状态机?

        假设一个对象。其构成为若干个状态,以及触发这些状态发生相互转移的事件,那么此对象称之为状态机。

        处理请求作为某种事件发送到系统中,由一个中央调度器传递给相应的事件调度器,进而对事件进行处理,处理完毕之后再次发送给中央调度器。再进行处理,直至处理完毕。

        Yarn的资源管理模块ResourceManager,其核心构成就是四类这种状态机(基于2.4版本号),各自是:

    (1)RMApp:用于维护一个Application的生命周期。

    (2)RMAppAttempt:用于维护一次试探执行的生命周期;

    (3)RMContainer:用于维护一个已分配的资源最小单位Container的生命周期;

    (4)RMNode:用于维护一个NodeManager的生命周期;

        以上四个状态机,以继承了EventHandler 的Interface的形式存在于Yarn源代码的org.apache.hadoop.yarn.server.resourcemanager中。其详细实现类,则是相应的xxxImpl类。

        提交到Yarn中的应用程序被称为Application,它可能会尝试执行多次,每次的尝试执行称为“Application Attempt”,假设一次尝试执行失败,则由RMApp创建还有一个继续执行,直至达到失败次数的上限。Container是执行环境的抽象概念,不管是ApplicationMaster还是详细的每一个Task都得执行在Container中。

    2 RMApp状态机

        此状态机的详细实现类为org.apache.hadoop.yarn.server.resourcemanager.rmapp. RMAppImpl。其内部记录了一个Application的全部状态RMAppState(共11种)、触发状态间转换的事件RMAppEvent(共14种)、Application的其它基本信息等。

    其功能就是接收其它对象发出的RMAppEventType类型的事件,然后依据当前状态和事件类型,将当前状态转移到第二种状态,同一时候触发一种行为。

        下图是RMApp的状态转换图。

       

        当中。NEW_SAVING状态,指的是使用日志记录Application基本信息时所处的状态,这是RM收到Application时所做的第一件事情。以便故障后重新启动。接收到RECOVER重新启动事件后。能够从NEW状态直接转变为SUBMITTED、ACCEPTED、FINISHED、FAILED、KILLED、FINAL_SAVING状态,可是默认情况下。Recover是不开启的,能够通过參数yarn.rsourcemanager.recovery.enabled设置。

        APP_REJECTED事件触发的情况比較多,client在提交Application时假设发生异常、RM审核Application不合法等,均会触发。

        Application执行失败的情况也比較多,可是ATTEMPT_FAILED事件被触发后,不一定直接转入FAILED。系统会检查当前Application的失败次数是否达到上限,假设没有的话,会又一次创建一个RMAppAttemptImpl对象,并让状态机回到ACCEPTED状态,否则进入FINAL_SAVING,进而进行失败处理,比方释放资源等。

    3 RMAppAttempt状态机

    此状态机的详细实现类为org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptImpl。其内部记录了一个Application Attepmt的全部状态RMAppAttemptState (共13种)、触发状态间转换的事件RMAppAttemptEvent(共15种)等。其功能就是接收其它对象发出的RMAppAttemptEventType类型的事件,然后依据当前状态和事件类型,将当前状态转移到第二种状态,同一时候触发一种行为。

        下图是RMAppAttempt的状态转换图。

     

         当中。RMAppAttemptImpl被创建之后。ResourceManager将其增加到ResourceScheduler中,通过合法性检查后的状态就是SCHEDULERED,此时開始给ApplicationMaster分配资源。

    在接收到分配的一个Container资源后,将Container信息写到磁盘。以后故障恢复用,保存完毕之前的状态变为ALLOCATED_SAVING。保存完毕了状态就变为ALLOCATED

    接着。ResourceManager中的ApplicationMasterLauncher与相应的NodeManager通信。进行启动ApplicationMaster,此时状态变为LAUNCHED,启动完毕之后。ApplicationMaster马上向ResourceManager注冊,状态变为RUNNING。

    同一时候,因为Yarn同意ApplicationMaster启动在客户端,比方Spark的yarn-client模式,此时仍然须要记录ApplicationMaster的日志以便进行故障恢复,正在进行记录日志的RMAppAttemptImpl所处的状态就是LAUNCHED_UNMANAGED_SAVING。至于RECOVER。与前面的RMApp状态机类似。

    还有几个比較重要的事件:

    (1)CONTAINER_ALLOCATED:RresourceManager将某个NodeManager节点上的Container分配给RMAppAttemptImpl之后,会创建一个RMContainerImpl(后文会讲),并向该对象发送一个启动事件,进而向RMAppAttemptImpl发送一个CONTAINER_ALLOCATED事件,此时RMAppAttemptImpl将获取分配到的Container资源,并发起一个日志记录的事件,将资源分配的信息写到磁盘以便进行故障恢复。

    (2)UNREGISTERED:当ApplicationMaster执行完毕之后,会通知ResourceManager,ResourceManager接受到通知后会发送一个UNREGISTERED事件给RMAppAttemptImpl。进而进入FINISHING状态,等待Container退出后,资源被回收,再变为FINISHED状态。可是假设ApplicationMaster是由client自行启动的。收到UNREGISTERED事件后会直接变为FINISHED状态。

    (3)CONTAINER_FINISHED:当ApplicationMaster所在的Container退出后。大当前NodeManager节点会将其状态汇报给ResourceManager,这时ResourceManager会发出一个FINISHED事件给RMContainerImpl,它再发出一个CONTAINER_FINISHED事件给RMAppAttemptImpl。

    (4)EXPIRE:若ApplicationMaster一段时间内未汇报心跳,则ResourceManager会发出一个EXPIRE事件给RMAppAttemptImpl,会清理ApplicationMaster和Container。

    (5)CONTAINER_ACQUIRED:ApplicationMaster获得资源后。向Container发出通知。RMContainerImpl接受到通知后进而向RMAppAttemptImpl发出CONTAINER_ACQUIRED事件,RMAppAttemptImpl将NodeManager信息保存。便于后面进行Container的清理。

    (6)STATUS_UPDATE:ApplicationMaster向ResourceManager的心跳汇报。

    4 RMContainer状态机

    此状态机的详细实现类为org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainerImpl。其内部记录了一个Container的全部状态RMContainerState (共9种)、触发状态间转换的事件RMContainerEvent (共8种)等。

    其功能就是接收其它对象发出的RMContainerEventType类型的事件,然后依据当前状态和事件类型,将当前状态转移到第二种状态,同一时候触发一种行为。

        下图是RMContainerImpl的状态转换图。

     

        当一个NodeManager上的资源不足以满足当前一个Application的请求却有不得不分配给这个Application时,当前节点会为此Application预留资源,逐渐累加空余的剩余资源直至满足要求后才把资源封装成一个Container发给ApplicationMaster。

    假设一个Container已经被创建,而且处在剩余资源的累加过程中。它就处于上图中的RESERVED状态。当此Container已经分配给ApplicationMaster。而且此时ApplicationMaster还没发送通知说它已经得到了资源时。此Container处于ALLOCATED状态,直至ApplicationMaster发送通知给ResourceManager说它已经拿到了资源,则状态变为ACQUIRED

    之后。ApplicationMaster与NodeManager通信来启动这些Container。而且NodeManager会将Container的状态通过心跳报告给ResourceManager。ResourceManager则对收到的心跳的每一个Container发送一个LAUNCHED事件,RMContainerImpl将收到事件相应的Container从失效列表中移除,表示Container状态正常。假设一段时间内。ApplicationMaster都没有使用某个Container,则ResourceManager对此Container发出EXPIRE事件,进行资源回收。

    5 RMNode状态机

        此状态机用于维护一个NodeManager的生命周期,事实上现类是org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeImpl。记录了NodeManager节点的各个状态NodeState (共6种)以及触发状态转换的事件RMNodeEvent(共9种),状态转换的同一时候会触发一种行为。

        下图是RMNodeImpl的状态转换图。

     

    当中,假设一个NodeManager节点被增加到黑名单,则其状态会被置为DECOMMISHONED状态,即下线状态,进而NodeManager进程会退出。若当前NodeManager节点处于UNHEALTHY状态,不健康了(比方磁盘损坏),则会通过心跳通知给ResourceManager,ResourceManager将不再为此节点分配新的任务。向ResourceManager的心跳报告丢失之后,NodeManager变为LOST状态。

    当Application运行完毕之后,会触发CLEANUP_APP事件。用于清理程序所占用的内存。而一个Container运行完毕的时候,会触发CLEANUP_CONTAINER事件。用于清理Container占用的资源。

    若一个NodeManager反复向ResourceManager注冊,则ResourceManager会触发一个RECONNECTED事件,RMNodeImpl收到事件通知后更新自身的信息。

    -------------------------------------------------------------------------------

    假设您看了本篇博客,认为对您有所收获,请点击下方的 [顶]

    假设您想转载本博客,请注明出处

    假设您对本文有意见或者建议。欢迎留言

    感谢您的阅读。请关注我的兴许博客


  • 相关阅读:
    数据结构(复习)链表完结篇
    第三部分_JSP详解续
    第二部分_搭建Java Web开发环境与配置Tomcat服务器&JSP详解
    第一部分_HTTP协议详解&HTML常用控件
    集合框架中的接口及其实现类
    封底估算
    从起泡排序探究算法正确性证明的一般规律
    各种曲线运动、弹球、笔记
    Android 之px于dp在Java代码中的转换
    sqlite之聚合函数的使用
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6891352.html
Copyright © 2011-2022 走看看