写点什么

分布式场景下,Apache YARN、Google Kubernetes 如何解决资源管理问题?

作者:星环科技
  • 2023-04-27
    上海
  • 本文字数:2160 字

    阅读完需:约 7 分钟

所有的资源管理系统都需要解决资源的有效利用、任务的有效响应、调度策略的灵活配置这三个最基本问题。那么在分布式的场景下,YARN 和 Kubernetes 是怎么解决的呢?本篇进行介绍。


— Apache YARN—

YARN 全称为(Yet Another Resource Negotiator),是一个集群共享的调度框架,有良好的可伸缩性,以及调度器本身有非常高的可靠性。YARN 的架构如下图所示,其中 ResourceManager 控制整个集群,并管理应用程序对基础计算资源的分配。它将各个资源部分(计算、内存、带宽等)安排给基础 NodeManager(YARN 的每节点代理)。ResourceManager 还与 Application Master 一起分配资源,与 NodeManager 一起启动和监视它们的基础应用程序。在此上下文中,Application Master 承担了以前的 TaskTracker 的一些职责,ResourceManager 承担了 JobTracker 的角色。

Application Master 管理一个在 YARN 内运行的应用程序的每个实例,并负责协调来 ResourceManager 的资源,并通过 NodeManager 监视容器的执行和资源使用(CPU、内存等的资源分配)。从 YARN 角度讲,Application Master 是用户代码,因此存在潜在的安全问题。NodeManager 管理一个 YARN 集群中的每个节点。NodeManager 提供针对集群中每个节点的服务,从监督对一个容器的终生管理到监视资源和跟踪节点健康。NodeManager 管理抽象容器,这些容器代表着可供一个特定应用程序使用的针对每个节点的资源。Container 是 YARN 中资源的抽象,封装了某节点上一定量的资源(内存,CPU),Container 的运行由 Application Master 向资源所在的 NodeManager 发起。一个 MapReduce Job 的调度过程如下图所示,一般会包含提交 Job、启动 Application Master、请求资源需求、通过后通过 Container 来进行数据处理这四步。这个流程也同样适用于 Spark、Flink 等计算引擎。通过 YARN 的这套资源管理体系,所有的中短期的计算任务都可以有效的得到统一的管理与调度。

调度能力是 YARN 的核心能力,YARN 社区一共提供了 FIFO、Fair 和 Capacity 三种调度模型,用户也可以继承 ResourceScheduler 的接口实现自定义的调度器。FIFO Scheduler 顾名思义是最简单的调度器,提交的作业按照提交时间先后顺序或者根据优先级次序将其放入线性队列相应的位置,在资源调度时,按照队列的先后顺序、先进先出地进行调度和资源分配。这种调度器过于简单,在实际的生产中,应用不是很多,毕竟需要调度的作业是有不同的优先级的。

在一些多用户的场景下,如大型集团每天夜间通过不同用户运行不同应用需要的批处理数据加工任务,应用的数量可能是数十个之多,集群资源在用户之间分配的公平性就比较重要。为了应对多租户的需求,社区推出了 Capacity Scheduler,让不同的组织使用各自的资源,相互之间不影响,同时提高整个集群的利用率和吞吐量。Capacity Scheduler 将资源分为多个队列,每个队列分配一部分资源,不同组织或用户的应用运行在其各自的队列中,从而做到资源隔离。在一个情况允许的情况下,为了提升集群吞吐,也允许队列之间的资源抢占。

Fair Scheduler 将资源划分到多个资源池中,每个资源池设定资源分配最低保障和最高上限,管理员也可以指定资源池的优先级,优先级高的资源池将会被分配更多的资源,当一个资源池有剩余时,可以临时将剩余资源共享给其他资源池。Fair Scheduler 先将用户的任务挂载到如下图的树形队列的叶子节点上,等待后续的资源调度。每个调度周期开始后,Scheduler 选择集群中的一个节点,从树形队列的根节点出发,每层队列都按照按照作业的优先级或者根据公平策略来选择一个子队列,最后在叶子节点上按照公平策略来选择一个 App,然后为这个 App 在对应的节点上分配适配的资源从而开始计算任务。

为了更好的支持生产需求,Fair Scheduler 还支持抢占式调度,如果某个资源池长时间未能分配到公平共享量的资源,调度器则会杀死过多分配资源的资源池的任务,以腾出资源并分配到这个资源池中供对应的任务调度。此外,它还提供了一个基于任务数目的负载均衡机制,从而将系统任务尽可能均衡的分配到各个节点上。

— Google Kubernetes —

Kubernetes 是 Google 的开源项目,用来管理 Docker 集群, 继承了 Borg 的优点,实现了编排、部署、运行以及管理容器应用,下图是 Kubernetes 的总体架构。Kubernetes 提供资源池化管理,可以将整个集群内的 CPU、GPU、内存、网络和硬盘等资源抽象为一个资源池,可以根据应用的资源需求灵活的根据资源池中的实时资源情况进行调度;Kubernetes 包含一个统一的调度框架,可以管理最多数千个服务器和数万个容器,同时提供插件化的接口让第三方来定制和扩展新的调度系统;此外 Kubernetes 支持通过 ConfigMap 等方式来动态的调整应用配置,从而具备动态调配的基础能力。我们将基于这些基础技术来开发支持复杂应用平台的调度系统。

关于 Kubernetes 的详细介绍,可以查看往期文章:Docker和Kubernetes的前世今生(下)

— 小结—

本篇介绍了两个分布式资源管理技术 YARN 和 Kubernetes。开源社区从 2018 年开始,多个项目如 Spark、Flink、Tensorflow 等都开始从 YARN 转向基于 Kubernetes 的管理和调度。长期上看,作为 Hadoop 集群的资源管理系统,YARN 非常有效的完成了其技术价值,但受限于其架构设计,很难往一个通用的数据中心调度系统演进。星环科技在 2017 年已经实现内部大数据平台从 YARN 切换到 Kubernetes,下一篇将从存储、计算、资源调度等方面介绍星环大数据技术体系。

用户头像

星环科技

关注

还未添加个人签名 2020-10-22 加入

领航大数据与人工智能基础软件新纪元

评论

发布
暂无评论
分布式场景下,Apache YARN、Google Kubernetes 如何解决资源管理问题?_资源管理_星环科技_InfoQ写作社区