menu

2018-10-28 Yarn小结

  • date_range info
    sort
    Hadoop
    label
    hadoop
    Hadoop

Yarn

YARN(Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,是一个可为上层应用提供统一的资源管理和调度的通用资源管理系统。
Yarn将资源管理和处理组件分开,为集群在利用率、资源统一管理和数据共享等方面带来巨大好处。

Yarn的架构

总体上为master/slave结构。ResourceManager负责对各个NodeManager上的资源进行统一管理和调度。当Client提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster,它负责向ResourceManager申请资源,并要求NodeManager启动可占用一定资源的任务。由于不同的ApplicationMaster被分布到不同的节点上,因此它们之间不会相互影响。 Yarn Architecture

Container

  • 资源容器,一个动态资源分配单位,将内存、CPU、磁盘、网络等资源封装在一起从而限定每个任务使用的资源量。

    ResourceManager

  • 集群只有一个的全局的资源管理器,Master上一个独立运行的进程,负责整个系统的资源管理和分配,包括处理Client请求、启动/监控APP master、监控nodemanager、资源的分配与调度。
  • 会追踪集群中有多少可用的活动节点和资源,协调用户提交的哪些应用程序应该在何时获取这些资源。它是惟一拥有此信息的进程,因此它可通过某种共享的、安全的、多租户的方式制定分配(或调度)决策。

    ApplicationMaster

  • 管理YARN内运行的应用程序的每个实例。
  • 协调来自resourcemanager的资源,并通过nodemanager监视容易的执行和资源使用情况。

    NodeManager

  • 集群有多个,负责每个节点上的资源和使用。
  • 管理Container
  • 定时地向ResourceManager汇报本节点上的资源使用情况和各个Container的运行状态。

Yarn的调度策略

可选调度器:FIFO Scheduler、Capacity Scheduler、Fair Scheduler。

FIFO Scheduler

  • 把应用按提交的顺序排成一个先进先出队列,在进行资源分配的时候,先给队列中最前的应用进行资源分配,待最前的应用需求满足后再给下一个分配,以此类推。
  • 不需要任何配置,但并不适用于共享集群。大的应用可能会占用所有集群资源,导致其它应用被阻塞。

    Capacity Scheduler

  • 有一个专门的队列用来运行小任务,但为小任务专门设置一个队列会预先占用一定的集群资源,导致大任务的执行时间会落后于使用FIFO调度器时的时间。
  • 允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。除此之外,队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。
  • “弹性队列”(queue elasticity):一个队列中运行多个job,如果这个队列的资源够用,那么就分配给这些job,如果这个队列的资源不够用,可能分配额外的资源给这个队列。
  • 当队列已满,不会强制释放Container,当一个队列资源不够用时,这个队列只能获得其它队列释放后的Container资源。可以为队列设置一个最大资源使用量,以免这个队列过多的占用空闲资源,导致其它队列无法使用这些空闲资源。

    Fair Scheduler

  • 为所有的应用分配公平的资源,可通过参数来设置对公平的定义
  • 公平调度可在应用间也可在多个队列间工作

Yarn的资源隔离

CPU资源隔离

Cgroups

内存资源隔离

Cgroups

线程监控

  • 基于实时反应进程树使用的内存总量的linux的/proc//stat文件判断任务粒度的内存使用量是否超过设定的最大值。
  • 为避免JVM的“fork()+exec()”模型引发的误杀操作,Hadoop赋予每个进程”年龄”属性,并规定刚启动进程的年龄是1,监控线程每更新一次,各个进程年龄加1,在此基础上,选择被杀死进程组的标准如下:如果一个进程组中所有的进程(年龄大于0)总内存超过用户设置的最大值的两倍,或者所有年龄大于1的进程总内存量超过用户设置最大值,则认为该进程组过量使用内存,就将其kill掉。

Yarn的调度流程

MapReduce

  1. Client生成相应文件后,连接ResourceManager请求提交一个Application
  2. ResourceManager返回Client一个地址
  3. Client提交文件到指定的HDFS地址上
  4. Client向ResourceManager申请运行该任务的MRAppMaster
  5. ResourceManager将Client的请求的任务初始化为一个task放入到其维护的队列中
  6. 当ResourceManager的调度策略调度到该task时,向一个NodeManager分配该task
  7. NodeManager根据task描述创建一个Container,来运行该task,此次运行的应该是MRAppMaster,需要先从HDFS中将上传的Job信息下载到Container中
  8. MRAppMaster根据Job中的信息向ResourceManager申请运行Maptask的运行资源
  9. ResourceManager将申请的task放入到其维持的任务队列中,根据策略来决定何时运行其中的task
  10. Nodemanager得到分配的task,开始分配Container
  11. MRAppMaster启动各机器上的Maptask
  12. 所有Maptask运行结束后,MRAppMaster向ResourceManager申请运行相应的Reducertask
  13. ResourceManager根据调度策略分配相应的运行资源
  14. Nodemanager得到分配的task,开始分配Container
  15. MRAppMaster启动各个Reducetask
  16. 所有Reducetask运行结束后,MRAppMaster向ResourceManager申请注销自己,进行资源回收