热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

聊聊关于YARN的全局调度

文章目录前言带有约束限制的调度全局调度的要求全局调度的流程附:关于约束标签下的Max-MinFairness方法引用前言在YARN调度的早期实现中,调

文章目录

    • 前言
  • 带有约束限制的调度
  • 全局调度的要求
  • 全局调度的流程
  • 附:关于约束标签下的Max-Min Fairness方法
  • 引用


前言

在YARN调度的早期实现中,调度的方式是基于NM节点的心跳来的。简单来说,就是每当一次节点的心跳来的时候,YARN scheduler会进行一次container分配尝试,然后将最适合分配的应用container分配在此节点上。这种一个节点一次的调度方式在决策选择上确实比较高效,但在某些场景上并不显得最优,比如带有约束条件的container调度来说。本文笔者来聊聊YARN后期实现的全局调度的设计理念以及它和原有方式的不同点。

带有约束限制的调度

在原先一个节点一次调度选择的策略下,假设当某应用只要求跑在一个拥有1千机器的1个节点上,那么Scheduler在为此应用分配container时,就需要进行一个一个节点多次的尝试,直到找到那个匹配的节点。

而在全局调度模式中,scheduler根据应用的要求,可以从更多的节点中去做节点地选择。这一点是和原有方式大大不同的。

全局调度的要求

全局调度需要有以下主要的要求,以此保证其实用性:

支持快速决策的响应。在大型分布式计算集群内,每分钟每分秒内会有大量的task运行开始结束,因此需要调度器能够快速地进行资源地重分配。但是全局调度因为面向更多的节点做分配选择,相比较原有方式,在时间选择开销上必然要大一些,因此这里我们需要全局调度同样能做到快速的决策选择。 倘若在一次节点选择中没有及时返回节点,那scheduler也应能及时返回timeout,结束本次的选择。


全局调度的流程

以下是YARN原先的调度流程图,scheduler触发的条件从node的heartbeat触发开始,然后进行后续的节点选择调度,
在这里插入图片描述
YARN全局调度模式下,它的调度过程主要有以下的变化:

  • 支持多Container分配线程并行执行
  • 面向更多节点做资源的请求分配
  • 新增Resource Committer服务来为资源分配的proposal进行再次判断

因为资源情况瞬息变化,当container proposal产生时,还需要在最终分配时进行再一次确认。此过程逻辑如下,

/** Scheduler will implement the interface*/
class Scheduler implements ResourceAllocationCommitter {// 获取Container allocation的proposalResourceAllocationCommitRequest getAllocationProposal(PlacementSet clusterPlacementSreadLock {// Following operations are in read-lockreturn rootQueue.getAllocationProposal(clusterPlacementSet);} }void tryCommit(ResourceAllocationCommitRequest proposal) { writeLock {// Following operations are in write-lock // Get application for a given proposalSchedulerApplicationAttempt app = get_application(proposal); // Check if the proposal will be accepted or not:// 检查Container的申请的proposal能否被接受boolean accepted = app.accept(proposal);// 如果proposal能够被接受,则采纳proposal的建议if (accepted) {// If proposal is accepted, apply the proposal (update states)// The reason why we need two separate accept / apply method is: // We need first check if proposal can be accepted before update // internal data. Otherwise we need revert changes if proposal is rejected by upper level.app.apply(proposal);} else {// Otherwise, discard the proposal} }
}

然后在allocation的thead中会调用上述scheduler的逻辑,

// We can have multiple such thread running at the same time
Thread allocationThread = new Thread() {void run() {while (true) {ResourceAllocationCommitRequest proposal =// Pass down cluster-placement-set, which is essentially a set of all the available nodes in the cluster scheduler.getAllocationProposal(get_available_placement_set());scheduler.tryCommit(proposal); }}
}

全局调度图示如下:
在这里插入图片描述

上述多线程同时并发处理Container的分配是其中一项对于全局调度模式快速响应的优化方式。在全局调度模式下,我们面向的可供选择的节点变多了。对于此方面,还有另外几项可以加速全局调度选择的措施:

  • 对于没有特殊节点偏向要求的应用,我们可以快速分配随机的节点进行资源的分配。
  • Cache节点排序列表,对于一部分资源请求来说,这些资源请求所优先选择的节点要求在短时间内是不变的,我们可以保存一定时间这样的结果。

附:关于约束标签下的Max-Min Fairness方法

Max-Min Fairness方法在资源调度选择中应用得十分广泛了,不过这里笔者想 额外谈谈关于标签约束下的Max-Min Fairness方法。标签约束的另外一层意思实际指的是用户/应用的节点要求选择。下面我们来通过一个简单的例子来了解下这个方法,此方法来源于一篇讲述 Choosy(一个在线的基于约束标签的最大最小公平调度器)的paper。

假设目前有2个用户{u1,u2},5台机器{m1, m2, m3, m4, m5},约束标签如下,

c1={m1, m2}: u1用户只能使用在m1和m2机器下的资源
c2={m2, m3, m4, m5}: u2用户只能使用m2, 3, 4, 5下的机器资源

在以上2者标签约束下,我们如何做到最大最小公平分配呢?

按照公平算法来,首先是第一轮,我们保证每个用户能分到等量的资源并且满足它们的约束标签,结果如下
u1: {m1, m2}
u2: {m3, m4}
因为u2用户不能用u2机器,否则u1所能使用到的最大资源数就少了。

然后第二轮,我们看在约束标签条件下,在不减少其它用户资源使用量的情况下,哪些用户还能增大其资源使用量,于是我们可以看到u2的资源使用量可以继续加大,
u1: {m1, m2}
u2: {m3, m4, m5}

所以以上就是最终的分配结果。

另外,关于YARN全局调度的更细节内容可参阅文末尾参考链接处。

引用

[1].https://issues.apache.org/jira/browse/YARN-5139 . [Umbrella] Move YARN scheduler towards global scheduler


推荐阅读
  • 深入解析Spring Cloud微服务架构与分布式系统实战
    本文详细介绍了Spring Cloud在微服务架构和分布式系统中的应用,结合实际案例和最新技术,帮助读者全面掌握微服务的实现与优化。 ... [详细]
  • 深入解析BookKeeper的设计与应用场景
    本文介绍了由Yahoo在2009年开发并于2011年开源的BookKeeper技术。BookKeeper是一种高效且可靠的日志流存储解决方案,广泛应用于需要高性能和强数据持久性的场景。 ... [详细]
  • 本文探讨了大型服务端开发过程中常见的几个误区,包括异步任务处理不当、日志同步模式使用、网络操作未设置超时、缓存命中率及响应时间未统计、单一缓存模式、分布式缓存加锁不当以及团队管理上的误区,旨在帮助开发者避免这些常见错误。 ... [详细]
  • 本文深入探讨Java编程语言的关键特性,包括但不限于其简洁性、强大的面向对象能力、跨平台兼容性、安全机制、高效性能及多线程支持等方面。文章旨在为开发者提供全面理解Java特性的指导。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • Java多重继承的替代方案及设计考量
    本文探讨了Java为何不支持多重继承,并深入分析了其背后的原理和替代方案。通过理解Java的设计哲学,开发者可以更好地利用接口和其他特性来实现复杂的类结构。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 深入解析Hadoop的核心组件与工作原理
    本文详细介绍了Hadoop的三大核心组件:分布式文件系统HDFS、资源管理器YARN和分布式计算框架MapReduce。通过分析这些组件的工作机制,帮助读者更好地理解Hadoop的架构及其在大数据处理中的应用。 ... [详细]
  • 字节跳动夏季招聘面试经验分享
    本文详细记录了字节跳动夏季招聘的面试经历,涵盖了一、二、三轮面试的技术问题及项目讨论,旨在为准备类似面试的求职者提供参考。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 性能测试工具的选择与应用
    本文探讨了性能测试工具的重要性及其在软件测试中的作用,重点介绍了选择合适性能测试工具的考量因素,并对几种常用的性能测试工具进行了对比分析。 ... [详细]
  • 本文整理了一系列Java面试问题,涵盖Java开发环境的分类、Java语言的核心特性、Linux环境下Java SE的安装步骤、常用的Java开发工具介绍,以及类与对象的基本概念等。 ... [详细]
author-avatar
初语2265_781
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有