这是我参与「第四届青训营 」笔记创作活动的的第10天

课程材料

课程链接:live./4354/yc_Yar…

学员手册:/post/713013…

完整手册:bytedance.feishu.cn/docx/doxcnE…

课程PPT:bytedance.feishu.cn/file/boxcnV…

一、YARN概述

调度体系设计的基本问题

  • 资源异质性与作业负载异质性

异质性通常指组成元素构成的多元性和相互之间较大的差异性。资源异质性是从体系所具有的资源角度来看的,关于大型数据中心来说,其收购往往是分批次的,不同批次的机器硬件装备和核算存储资源都存在较大差异,很难确保选用完全相同的装备,目前首要经过将资源分配单位细粒度划分以及虚拟化技能来处理;作业负载异质性是从体系提交的使命角度来看的,负载类型多样化(流处理、批处理、内存核算、在线服务等),使命偏好多样化和动态化(使命的约束条件、运转进程中资源运用动态改变),资源需求多样化(CPU,内存,GPU,IO等),例如对外服务要确保高可用和快速呼应,关于批处理使命要确保快速调度等。

  • 数据部分性

大数据场景下因为数据传输开支要远大于核算逻辑传输开支,因此往往将核算使命推送到数据存储所在地进行,这种设计哲学一般被称为数据部分性问题。在资源办理与调度语境下一般存在3种类型数据部分性:节点部分性,机架部分性和大局部分性。节点部分性完结核算不需求进行数据传输,机架部分性需求在机架之间进行数据传输存在必定开支,其它状况则属于大局部分性需求跨机架进行网络传输从而产生较大的网络传输开支,因此最优的方法是尽可能确保节点部分性。

  • 抢占式与非 抢占式调度

在多用户多使命场景下,面对已分配资源,资源办理与调度体系有两种不同类型的调度方法:抢占式调度与非抢占式调度。抢占式调度指的是当体系资源不足或存在资源竞争时高优先级的使命能够抢占低优先级使命的资源;非抢占式调度,每次只允许从闲暇资源中分配,闲暇资源若不足则须等候其它使命开释资源后才干持续推动,mesos选用非抢占式调度。两种方法各有特点,一般假如强调高优先级使命履行效率的调度战略会选用抢占式调度,强调资源公平分配的调度会选用非抢占式调度。

  • 资源分配粒度

大数据场景下的核算使命往往出现层级结构,例如:作业级(Job)-使命级(Task)-实例级(Instance),从核算使命视角来看,此刻资源调度体系就面对资源分配粒度问题,资源分配粒度首要存在三种方法:(1)群体分配战略(Gang Scheduler),即要么全满足要么全不满足,Flink和MPI使命依靠这种方法;(2)增量满足式分配战略,只需分配部分资源就能够发动运转,MR选用这种方法;(3)资源储藏战略,资源到达必定量才干发动作业,在未获得足够资源时作业能够先持有目前现已分配的资源并等候其他作业开释资源,调度体系不断获取新资源并进行储藏和积累,直到分配到的资源量到达最低标准后开端运转,在作业发动前现已分配的资源处于闲置状况。

  • 饿死与死锁问题

饿死是由于调度战略不当而导致核算使命长时间无法获得开端履行所需求的最少资源量,例如支撑优先级调度时,假如不断出现高优先级使命,那么低优先级使命可能饿死;死锁是由于资源分配不当而导致整个调度体系无法正常履行,例如在资源储藏战略下,假如AB两个作业发动作业需求的最小资源为2/3,那么假如两个使命被分配了1/2的资源时,就导致死锁。调度体系出现死锁必定表现为某些作业处于饿死状况,但核算使命饿死的情景并不必定意味着调度体系处于死锁状况。

  • 资源阻隔方法

为了减少使命之间的干扰需求进行必定的阻隔办法,LXC是一种轻量级的内核虚拟化技能,LXC在资源办理方面依靠于 Linux 内核的 cgroups 子体系,cgroups 子体系是 Linux 内核供给的一个依据进程组的资源办理框架,能够为特定的进程组限定能够运用的资源。其他技能有Intel RDT。

调度体系的演进

走进 Yarn 资源管理和调度|青训营笔记

两层调度体系

  • 产生背景:为了处理集中式调度体系的扩展性问题,体系完结复杂,可扩展性差,不能支撑不同类型使命等缺点。

  • 完结原理:将资源办理和使命调度解耦。集群资源办理器担任保护集群中的资源信息并将资源分配给详细的使命,使命办理器担任申请资源并将申请到的资源依据用户逻辑进行细分和详细的使命调度。

  • 优点:

    • 资源办理器只担任资源分配,使命调度由运用完结,提高了体系的扩展性;
    • 使命调度逻辑由详细的使命完结,能够供给对不同类型使命的支撑;
    • 内部完结模块化,利于保护和扩展;
  • 缺点:

    • 使命无法感知大局的资源状况,只能依据request/offer来进行资源获取,无法有用避免异构负载之间的功能干扰问题;
    • 使命调度和资源办理解耦不利于完结多使命间的优先级抢占;
    • 一切使命的资源恳求都需求资源办理器进行处理,此外其还需求与节点办理器之间维持通讯,导致资源办理器存在单点问题;

YARN全体架构

走进 Yarn 资源管理和调度|青训营笔记

  • Resource Manager

    • 整个集群的大脑,担任为运用调度资源,办理运用生命周期;
    • 对用户供给接口,包含命令行接口,API, WebUI 接口;
    • 能够一起存在多个RM、,同一时间只要一个在作业,RM 之间经过 ZK 选主;
  • Node Manager

    • 为整个集群供给资源, 承受 Container 运转;
    • 办理Contianer的运转时生命周期, 包含Localization, 资源阻隔, 日志聚合等;

YARN上运转的作业在运转时会拜访外部的数据服务,常见的如 HDFS, Kafka 等;在运转结束后由 YARN 担任将日志上传到 HDFS

使命运转核心流程

走进 Yarn 资源管理和调度|青训营笔记

  1. Client 获取 ApplicationID,调用 ApplicationClientProtocol #getNewApplication。
  1. RM 回来 GetNewApplicationResponse,其间首要包含:ApplicationID、最大可申请资源以及相关装备。
  1. Client 将使命运转所需的资源上传至HDFS的指定目录下,并初始化AM装备,首要结构 ApplicationSubmissionContext (运用ID、运用名称、所属行列、运用优先级、运用类型、运用测验次数、运转AM所需求的资源等)和 ContainerLaunchContext(容器运转所需的本地资源、容器持有的安全令牌、运用自有的数据、运用的环境变量、发动容器的命令行等)。
  1. Client 将 AM 提交至 RM,调用 ApplicationClientProtocol #submitApplication。
  2. RM 依据必定的分配战略为 AM 分配container,并与 NM 通讯。
  3. NM 发动 AM。
  4. AM 从 HDFS 下载本使命运转所需求的资源并进行初始化作业。
  5. AM 向 RM 注册和申请资源。ApplicationMasterProtocol # registerApplicationMaster,注册信息包含:AM所在节点的主机名、AM的对外RPC服务端口和跟踪运用状况的Web接口;ApplicationMasterProtocol # allocate,相关信息封装在 AllocateRequest中包含:呼应ID、申请的资源列表、AM主动开释的容器列表、资源黑名单、运用运转进度。
  6. RM 承受 AM 恳求后,依照调度算法分配全部或部分申请的资源给 AM,回来一个 AllocateResponse 目标,其间包含:呼应ID、分配的container列表、已完结的container状况列表、状况被更新过的节点列表、资源抢占信息(强制回收部分和可自主分配部分)等。
  7. AM 获取到资源后与对应的 NM 通讯以发动 container, ContainerManagementProtocol # startContainers
  8. NM 发动container。
  9. Container 从 HDFS 下载使命运转必要的资源。
  10. Container 在运转进程中与AM通讯及时报告运转状况。
  11. 使命运转完结后 AM 向 RM 刊出,ApplicationMasterProtocol # finishApplicationMaster()。

二、核心模块

Resource Manager

全体架构

走进 Yarn 资源管理和调度|青训营笔记

总的来说,RM 担任集群一切资源的统一办理和分配,接收各节点报告信息并依照必定战略分配给各个使命;

  • 与客户端交互,处理来自客户端的恳求
  • 发动和办理 AM,运转失败时主动重试
  • 办理一切 NM,接收 NM 的报告信息并下达办理指令
  • 资源办理与调度

    • 将资源依照必定方法组织起来,例如:资源池
    • 将使命依照必定方法组织起来,例如:行列
    • 接收来自各个 AM 的资源恳求
    • 依照必定分配战略将资源分配给 AM

调度剖析

走进 Yarn 资源管理和调度|青训营笔记

调度流程: YARN 调度流程由心跳触发

  • AM 定期与 RM 保持心跳,并将资源恳求记录在 RM 中;
  • 触发时机: 由节点心跳触发针对此节点的调度;
  • 找 Label: 依据节点 Label 找到对应 Lable 下的一切行列;
  • 找行列: 将行列进行 DRF 排序, 找到当前最“饥饿”的行列;
  • 找运用: 将此行列内一切运用依照优先级进行排序(优先级由用户提交时指定), 找到优先级最高的运用, 优先级相一起按DRF 算法排序;
  • 找资源恳求: 将此运用内的一切资源恳求依照优先级排序(优先级由核算引擎指定), 找到优先级最高的资源恳求进行资源分配;

走进 Yarn 资源管理和调度|青训营笔记

Node Manager

走进 Yarn 资源管理和调度|青训营笔记

总的来说,NM 是节点代理,从 AM 承受命令(启停 Container)并履行,经过心跳方法向 RM 报告节点状况并领取命令(清理 Container)。

  • 与 RM 交互

    • 心跳报告节点健康状况和 Container 运转状况;
    • 领取 RM 下达的命令;
  • 与 AM 交互

    • 发动容器
    • 停止容器
    • 获取容器状况

走进 Yarn 资源管理和调度|青训营笔记