为了账号安全,请及时绑定邮箱和手机立即绑定

分布式杂谈之调度器

标签:
Java 微服务

在我看来,分布式是研究如何让程序能够在多台机器上运行拥有更好的性能的一个方向。那如果要实现这一点,调度很关键。

目前我读过的与分布式调度器有关的论文有 Mesos, Omega, Yarn 和 Borg。这其中 Mesos 是最早的,它来自伯克利大学。其最亮的地方在于两层调度的框架,使得调度跟框架是松耦合的。目前很多公司都是在用它的,而且有很多基于 Mesos 的创业公司,比如 Mesosphere 等等。Omega 跟 Mesos 的第二作者是一个人。Omega 具体来说也不知道算是谁写的,应该算是大学和谷歌一起做的研究。Omega 发表在 EuroSys’13 上,是在基于 Mesos 的基础上,提出了一种完全并行的调度的解决方案,能够在调度上有更好的性能。不过论文是采取的模拟实验来进行验证的,不知道是否有生产上的使用。Borg 是发表在 EuroSys’15 上的,是谷歌真正一直在使用的集群管理工具。可以说谷歌为什么可以用廉价的机器来达到很高的可用性,有很大一部分是因为 Borg。Borg 和 Omega 是不开源的,而 Mesos 是开源的,不过 Borg 有一个开源的继任者,就是目前大名鼎鼎的 Kubernetes。Kubernetes 下面用 Docker Conatainer,而不是 Linux 内核的那些用来做进程级别的性能隔离的特性来实现的。不过最近 Kubernetes 似乎在跟 Docker 撕逼,因为 Docker 公司的一些强势吧,可能之后不会只支持 Docker Conatiner。Kubernetes 在很长的时间内都不是 production ready 的,只能支持 100 个节点,跟 Borg 的 10K 完全没法比,不知道现在是什么情况。

Mesos

Mesos 是调度器绕不过去的一篇论文,因为它是目前在工业界应用最广泛的开源系统之一。Mesos 跟 exokernel 的思想很像,分离了管理和保护。之前所有的调度器,都是由自己来决定是否把资源给某个任务的,在 mesos 中是 framework 决定是否接受资源的要约。在容灾上,mesos 是通过 zookeeper 做 leader election 的,而且 master 维护的状态是 soft 的,因此 master 没有单点故障的问题,而对于 node 的故障,会反馈给 framework,让他们来处理。Mesos 就像是一个最小的 kernel,所有的决定都是『用户态』的 framework 来做的。

Mesos 是在 node 上给每一个 framework 运行一个 executor 的,使用 Linux Containers 等容器技术来做隔离。最后通过在一个集群上跑多个 framework 的方式来验证 mesos 的可用性。这篇文章整体来说比较简单,也可能是因为听过太多次关于 mesos 的架构了。

Omega

// TODO Add the notes

Borg

Borg 是谷歌发表在 EuroSys’15 上的一篇文章,讲述了其内部是如何做集群管理的。Borg 是我看过的第一篇关于集群管理的论文。首先介绍下 Borg 的特点,Borg 是一个用来做集群管理的工具,它的目标就是让跑在它上面的应用能够拥有很好的可用性和可靠性的同时,能够提高机器的利用率,而且这些是在一个非常大规模的机器环境下。在 Borg 被设计的时候,还没有对虚拟化的硬件支持,也就是 Intel VT-x 等等那些硬件特性,所以 Borg 是使用了进程级别的隔离手段,也就是 Control Group。

Borg 的架构其实还挺简单的,是比较经典的 Master/Slave 架构,其中在 Master 部分,有两个抽象的进程,一个是 Borg Master,一个是 Borg Scheduler。Borg Master 是有5个备份的,每个都会在内存里维护集群里所有对象的状态。他们5个组成了一个小集群,用 Paxos 算法做一致性的,会选举出一个 leader 来处理请求,这点是之前 Kubernetes 做不到的。

调度器方面的实现比较简单,就是一个队列,根据优先级做 round-robin。这里读起来感觉没什么新意,就不多说了。调度的平均时间大概是 25s,其中 80% 的时间在下载包。谷歌也是实诚,下载安装包的时间都算到调度里面去。

谷歌写的论文一向是简单易懂,特别良心的。所以要是对集群感兴趣,可以去看下这篇论文,花两三个小时就能看完了。

Yarn

// TODO Wait to read

Sparrow

Sparrow 是一个与前面的调度器架构都不一样的实现,是去中心化的架构。之前的所有调度器,无论是 monolithic 的还是后面 Mesos 那样两层的架构,都是有一个中心化的调度器在运行,这样的方式会使得调度器的效率不是那么高。 Sparrow 是 AMPLab 的又一力作,发表在 SOSP’13 上,它不是一个 general-purpose 的调度器,而是针对 short job 这一特殊的 workload。其灵感来源于一个负载均衡方面的经典论文,k choices。这篇文章的 idea 是,在 k 台机器里选一个最好的,而不是在 n 里选一个最好的,可以大大降低负载均衡的 overhead,同时也对负载的分配跟最优解差不了多少。

Sparrow 核心的思想就是,在分配 task 的时候,随机选择几个 worker,然后选一个最合适的。因为在 Sparrow 的应用场景里,所有的 task 都是很短的,因此只需要考虑任务队列的长度就差不多了。针对多 task 的分配问题,Sparrow 对其进行了批处理来优化,比如 task 为 2 的时候,不是进行两次选择,每次在 k 个 worker 里选择 1 个,而是在 2k 个 worker 里选择 2 个。

这篇论文读起来很轻松,idea 比较简单,但是是跟之前完全不一样的思路。讲道理,其实 idea 很容易想,在读 k choices 的时候就想这样的思想能不能用在调度器上,结果人家早就想到了。

目前 Sparrow 开源在 GitHub 上,但是没听说哪个公司在把它用在生产系统上。它的最大的问题就是 workload 比较单一,只能对 short job 有比较好的效果。

Apollo

// TODO Wait to read

Hawk

有一种寻找 idea 的方法,就是在已有的两种极端的思想中做一个你中有我,我中有你的取舍,所有计算机的问题,都是 trade off 嘛,两种极端肯定是为了不同的追求,然后提出一个折中的方案,往往是一种取巧的想 idea 的方式。类似的例子有 monolithic kernel,micro kernel 和 hybrid kernel。这篇文章也是这样,它是把去中心化和中心化的调度器做了一个混合。之前提到,去中心化的实现只适合 short job 的 workload,Hawk 在调度 long job 的时候会使用中心化的调度器,在调度 short job 的时候会使用去中心化的调度器。

除此之外,Hawk 为了两者能够更好地在一起工作还做了一些微小的工作,比如在一个 worker 做完所有的事情后,会偷别的 worker 的 short job 来做,果然资本主义的 worker 都是积极进取的。

哦对了,这篇文章的验证是使用谷歌开放的自己的 tracing 数据集来做的,这个数据集也是开源的,在 https://github.com/google/cluster-data 可以找到。

Mercury

Mercury 跟 Hawk 是约等于一模一样的 idea,都是总结了中心化的调度器和去中心化各自的优缺点后,提出了一种 hybrid 的方法。Mercury 是由微软提出的,PPT 做的更好看一些。它在 YARN 上进行了一个实现,Hawk 则是实现在了 Spark 上。说明论文还是有实现有实验才行。

Firmament

这是一篇基于最大流最小割的中心化调度的论文,本文是借鉴了 Quincy 的研究,但是在解最大流最小割的时候,做了一些问题特定的优化,解决了 Quincy 不能解决的效率问题。并且 Firmament 会并行地运行两个 MCMF 的算法,来加快其中的过程。它有在 Kubernetes 上的实现。

ERA

// TODO Add the notes

Efficient Queue Management for Cluster Scheduling

// TODO Add the notes

Tarcil

// TODO Add the notes

Eagle

// TODO Wait to read

Canary

// TODO Wait to read

Profiling a warehouse-scale computer

// TODO Wait to read
点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消