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

集群调度框架的架构演进之路(转)

集群架构是现代数据中心非常重要的组件,在最近几年中有长足发展。架构也从单体式设计转向更加灵活、去中心化和分布式设计。然而,许多现代开源实现仍然是单体式设

集群架构是现代数据中心非常重要的组件,在最近几年中有长足发展。架构也从单体式设计转向更加灵活、去中心化和分布式设计。然而,许多现代开源实现仍然是单体式设计或者缺少很多功能,而这些功能对实际用户非常有用。

这篇博客是关于大型机群任务调度系列的第一篇,资源调度在Amazon、Google、Facebook、微软或者Yahoo已经有很好实现,在 其它地方的需求也在增长。调度是很重要的课题,因为它直接跟运行集群的投入有关:一个不好的调度器会造成低利用率,昂贵投入的硬件资源被白白浪费。而光靠 它自己也无法实现高利用率,因为资源利用相抵触的负载必须要仔细配置,正确调度。
架构演进

这篇博客讨论了最近几年调度架构如何演进,为什么会这样。图一演示了不同的方法:灰色方块对应一个设备,不同颜色圈对应一个任务,有“S”的方形代表一个调度器。​箭头代表调度器的调度决定;三种颜色代表不同工作负载(例如,网站服务,批量分析,和机器学习)



图一:不同调度架构,灰色框代表集群设备,圆圈代表任务,Si代表调度器。

(a)单体式调度器(b)二级调度 (c)共享状态调度 (d)分布式调度 (e) 混合式调度​

许多集群架构,例如大量高性能计算(HPC),使用的是Borg调度器,它跟Hadoop调度器和Kubernetes调度器完全不同,是单体式调度。

单体式调度

单一调度进程运行在一台物理机内(例如Hadoop V1中JobTacker,Kubernetes中的kube-scheduler),将任务指派给集群内其它物理机。所有负载都服从于一个调度器,所有 任务都通过这一个调度逻辑运行(参见图一a)。这种架构最简单格式唯一,在此基础上发展起了很多负载的调度器,例如Paragon和Quasar调度器, 采用机器学习方法来避免不同负载之间资源竞争。

今天集群都运行着不同类型的应用(与之相对应的是MapReduce早期作业场景),然而,采用单一调度器来处理这么复杂异构负载会很棘手,有几个原因:
调度器必须区分对待长期运行服务作业和批量分析作业​,这是合理的需求。
因为不同应用有不同的需求,催生调度器内加入更多功能,增加业务逻辑和部署方式。
调度器处理任务顺序变成一个问题:如果调度器不仔细设计,队列效果(例如线头阻塞head-of-line blocking)和回滚会成为问题。

总之,这听起来像是给工程师带来噩梦,调度器维护者面对的没完没了的功能请求证实了这点。

二级调度

二级调度通过将资源调度和任务调度分离解决了这个问题,这使得任务调度逻辑不仅可以根据不同应用要求而进行裁剪,而且保留了在集群之间共享资源的 可能性。尽管侧重点不同,Mesos和 YARN集群管理都使用了这种方法:Mesos中,资源是主动提供(offer)给应用层调度,而YARN则允许应用层调度请求(request)资源 (,并且随后接受被分配资源)。图一b展示了这一概念,作业负责调度(S0-S2)跟资源管理器交互,资源管理器则给每个作业分配动态资源。这一方案赋予 客户灵活调度作业策略的可能性。

然而,通过二级调度解决问题也有问题:应用层调度​将资源全局调度隐藏起来,也就是说,不再能看到全局性的可选资源配置。相反,只能看到资源管理 器主动提供(offer,对应于Mesos)或者请求/分配(request/allocate,对应于YARN)给应用的资源。由此带来一些问题:​
重入优先权(也就是高优先权会将低优先权任务剔除​)实现变的很困难。在基于offer模式,被运行中任务占用的资源对高一级调度器不可见;在基于request模式,底层资源管理器必须理解重入策略(跟应用相关)。
调度器​不能介入运行中业务,有可能减低资源使用效率(例如,“饥饿邻居”占据了IO带宽),因为调度器看不见他们。
应用相关调度器更关注底层资源使用的不同情况,但是他们唯一选择资源的方法就是资源管理器提供的Offer/request接口,这个接口很容易变的很复杂。

共享状态架构

共享状态架构通过采用半分布式模式来解决这个问题,​这种架构下集群状态多副本会被应用层次调度器独立更新,如图一C中所示。一旦本地有更新,调度器发布一个并发交易更新所有共享集群状态。有时候因为另外一个调度器发出了一个冲突交易,交易更新有可能失败。

最重要的共享状态架构实例是Google的Omega系统,以及微软的Apollo和Hashicorp的Nomad容器调度。这些例子中,共享 集群状态架构都是通过一个模块实现,也就是Omega中的“cell state”,Apollo中的“resource monitor”,以及Nomad中的“plan queue”。Apollo跟其他两个不同之处在于共享状态是只读的,调度交易直接提交到集群设备;设备自身会检查冲突,来​决定接受或者拒绝更新,使得 Apollo即使在共享状态暂时不可用情况下也可以继续执行。

逻辑上来说,共享状态设计不一定必需将全状态分布在其它地方,这种方式(有点像Apollo)每个物理设备维护自己的状态,将更新发送到其它感兴 趣的代理,例如调度器,设备健康监控,和资源监控系统。每个物理设备本地状态就成为一个全局共享状态的“沟通片”(shard)。

然而,共享状态架构也有一些缺点,必须作用在稳定的(过时的,stale)信息(这点跟中心化调度器不同),有可能在高竞争情况下造成调度器性能下降(尽管对其它架构也有这种可能)。

全分布式架构

看起来这种架构更加去中心化:调度器之间没有任何协调,使用很多各自独立调度器响应不同负载,如图一d所示。每个调度器都作用于自己本地(部分或 者经常过时的【stale】)集群状态信息。典型的,作业可以提交到任何调度器,调度器可以将作业发布到任何集群节点上执行。跟二级调度器不同的是,每个 调度器并没有负责的分区,全局调度和资源分区是服从统计意义和随机分布的,这有点像共享状态架构,但是没有中央控制。

尽管说去中心化底层概念(去中心化随机选择)是从1996年出现,现代意义上分布式调度应该是从Sparrow论文开始的,当时有一个讨论是:合 适粒度(fine-grained)任务有很多优势,Sparrow论文的关键假设是集群上任务周期可以变得很短;接下来,作者假定大量任务意味着调度器 必须支持很高通量的决策,而单一调度器并不能支持如此高的决策量(假定每秒上百万任务量),Sparrow将这些负载分散到许多调度器上。

这个实现意义重大:去中心化理论上意味着更多的仲裁,但是这非常适合某类负载,我们会在后面的连载中讨论。现在,足够理由证明,由于分布式调度是无协调的,因此相对于复杂单体式调度,二级调度或者分布状态时调度,更适合于简单逻辑。例如:
1.分布式调度​是基于简单的“时间槽(slot)”概念,将每台设备分成n个标准时间槽,同时运行n个并发任务,尽管这种简化忽略了任务资源需求是各自不同的事实。
2.在任务端(worker side)使用服从简单服务规则的队列方式(例如Sparrow中FIFO),这样调度器的灵活性受到限制,调度器只需决定在哪台设备上将任务入队。
3.因为没有中央控制,分布式调度器对于全局变量设置(例如,fairness policies或者strict priority precedence等)有一定难度。
4.因为分布式调度是为基于最少知识做出快速决策而设计,因此无法支持或承担复杂应用相关调度策略,因此避免任务之间干扰,对于全分布式调度来说很困难。

混合式架构​

混合式架构是为了解决全分布式架构缺陷,最近(发端于学院派)提出的解决方式,它综合了单体式或者共享状态的设计。这种方式,例如 Tarcil,Mercury和Hawk,一般有两条调度路径:一条是为部分负载设计的分布式路径(例如,短时间任务或者低优先级批量负载),另外一条集 中式调度,处理剩下负载,如图一e所示。对于所描述的负载来说,混合架构中发生作用的调度器都是唯一的。实际上,据我所知,目前还没有真正的混合架构部署 于生产系统中。
实际意义

不同调度架构相对价值,除了有很多研究论文外,其讨论不仅仅局限在学院内,从行业角度对于Borg,Mesos和Omega论文的深入讨论,可以 参见Andrew Wang的专业博客。然而,很多以上讨论的系统都已经部署在大型企业生产系统中(例如,微软的Apollo,Google的Borg,Apple的 Mesos),反过来这些系统激励了其它可用开源项目。

如今,很多集群系统运行容器化负载,因此有一系列面向容器的“调度框架”(Orchestration Framworks)出现,他们跟Google以及其它被称为“集群管理系统”类似。然而,很少关于这些调度框架和设计原则的讨论,更多是集中于面向用户 调度的API(例如,这篇Armand Grillet的报道,比较了Docker Swarm,Mesos/Marathon和Kubernetes的默认调度器)。然而,很多客户既不懂不同调度架构的不同,也不知道哪个更适合自己的应 用。

图二展示了一部分开源编排框架的架构和调度器支持的功能。图表底部,也包括google和微软闭源系统作比较。​资源粒度一列展示调度器分配任务给固定大小时间槽,还是按照多维需求(例如CPU,memory,磁盘IO,网络带宽等)分配资源。



图二:常用开源编排框架分类和功能比较,以及与闭源系统比较。

决定一个合适调度架构主要因素在于你的集群是否运行一个异构(或者说混合的)负载。例如,前端服务(例如,负载均衡web服务和 memcached)和批量数据分析(例如,MapReduce或者Spark)混合在一起,这种组合对于提高系统利用率是有意义的,但是不同应用需要不 同调度方式。在混合设定下,单体式调度很可能导致次优任务分配,因为基于应用需求,单体调度逻辑不能多样化,而此时二级或者共享状态调度可能更加适合一 些。

许多面向用户服务负载运行的资源一般是满足容器的峰值需求,但是实际上资源都是过分配的。这种情况下,能够有机会降低给低优先级负载过分配资源对 高效集群来说是关键。尽管Kubernetes拥有相对成熟方案,Mesos是目前唯一支持这种过分配策略的开源系统。这个功能未来应该有更大改善空间, 因为根据Google borg集群来看很多集群利用率任然小于60-70%。后续博客我们将就资源预估,过分配和有效设备利用等方面展开讨论。

最后,特殊分析和OLAP应用(例如,Dremel或者SparkSQL)非常适合全分布式调度。然而,全分布式调度(例如Sparrow)内置 相对严格功能设置,因此当负载是同构(也就是,所有任务同时运行)、配置时间(set-up times)很短(也就是,任务调度后长时间运行,如同MapReduce应用任务运行于YARN)、任务通量(churn)很高(也就是,许多调度决定 必须很短时间内做出)时非常合适。我们将在下一个博客中详细讨论这些条件,以及为什么全分布式调度(以及混合架构中分布模块)只对这种应用场景有效。

现在,我们可以证明分布式调度比其他调度架构更加简单,而且不支持其他资源维度,过分配或者重新调度。

总之,图二中表格表明,相对于更高级但是闭源的系统来说,开源框架仍然有很大提升空间。可以从如下几方面采取行动:功能缺失,使用率不佳,任务性能不可预测,邻居干扰(noisy neighbours)降低效率,调度器精细调整以支持某些客户忒别需求。

然而,也有很多好消息:尽管今天还有很多集群仍然使用单体式调度,但是也已经有很多开始迁移到更加灵活架构。Kubernetes今天已经可以支 持可插入式调度器(kube-scheduler pod可以被其它API兼容调度pod替代),更多调度器从1.2版本开始会支持“扩展器”提供客户化策略。Docker Swarm,据我理解,在未来也会支持可插入式调度器。​

下一步

下一篇博客将会讨论全分布式架构对于可扩展式集群调度是否关键技术创新(反对声音说:不是必须的)。然后,我们会讨论资源适配策略(提高利用率),最后讨论我们Firmament调度平台如何组合和共享状态架构和单体式调度质量,以及全分布调度器性能问题。

原文链接:The evolution of cluster scheduler architectures(翻译:杨峰)
译文来自:Dockerone



推荐阅读
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 在本文中,我们将探讨如何在Docker环境中高效地管理和利用数据库。首先,需要安装Docker Desktop以确保本地环境准备就绪。接下来,可以从Docker Hub中选择合适的数据库镜像,并通过简单的命令将其拉取到本地。此外,我们还将介绍如何配置和优化这些数据库容器,以实现最佳性能和安全性。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 寒假作业解析:第三周 2月12日 第7题
    尽快完成之前的练习任务!每日一练2.1 Problem A Laurenty and Shop 的题目要求是选择两条不同的路线以最小化总的等待时间。简要分析:通过对比不同路线的等待时间,可以找到最优解。此问题可以通过动态规划或贪心算法来解决,具体取决于路线的复杂性和约束条件。 ... [详细]
  • 本课程深入探讨了 Python 中自定义序列类的实现方法,涵盖从基础概念到高级技巧的全面解析。通过实例演示,学员将掌握如何创建支持切片操作的自定义序列对象,并了解 `bisect` 模块在序列处理中的应用。适合希望提升 Python 编程技能的中高级开发者。 ... [详细]
  • Redis哈希数据结构入门指南
    Redis的哈希数据结构与Java中的HashMap类似,采用数组加链表的方式实现。数组用于存储哈希值的位置,而链表则用于处理哈希冲突的情况。此外,Redis的哈希数据结构还支持高效的字段操作和内存优化,适用于多种应用场景,如缓存和会话管理。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • OSEK网络管理功能的全面测试分析
    本文针对OSEK网络管理功能进行全面测试分析。在新入职某公司后,由于公司需要开发OSEK NM(OSEK网络管理)功能,而市场上缺乏成熟且经济实惠的商业解决方案,因此我们决定自主开发。在开发过程中,通过网络资源获取了相关开源代码,并对其进行了深入研究和优化。测试结果表明,该开源代码在功能实现和性能表现方面均达到了预期目标,为公司的OSEK NM系统开发提供了有力支持。 ... [详细]
  • 在iOS开发中,基于HTTPS协议的安全网络请求实现至关重要。HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer)是一种旨在提供安全通信的HTTP扩展,通过SSL/TLS加密技术确保数据传输的安全性和隐私性。本文将详细介绍如何在iOS应用中实现安全的HTTPS网络请求,包括证书验证、SSL握手过程以及常见安全问题的解决方法。 ... [详细]
author-avatar
dibaoejx
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有