文档章节

Mesos资源调度器的实现分析

谈吐鱼
 谈吐鱼
发布于 2013/12/18 22:21
字数 2514
阅读 1.6K
收藏 17

<h3>1 mesos DRF介绍</h3> <p>mesos调度器是根据DRF(dominant resource fairness)算法实现的。DRF算法背后的直观想法是在多资源类型的环境下,一个用户的资源分配应该由用户的dominant share(主导份额的资源)决定,dominant share是在所有已经分配给用户的多种资源中,占据最大份额的一种资源。</p> <p>mesos使用resource offers的方式实现各个框架之间的资源分配。Resource offer是多个slave节点上的一组空闲资源。Master根据调度策略来决定提供多少资源给每一个framework,通过以Resource offer的形式发送给发送给框架,然后框架响应Resource offer,确认Resource offer中已使用的资源和返回剩余的空闲资源。</p> <p>mesos的资源分配器是一个分层的加权max-min fairness的实现。通过抽象了一个role概念,将framework按照role进行分组。那么资源分配就可以分为两层:首先是在各个框架群组间通过加权的DRF算法进行排序;其次在框架群组内部,对各个framework使用加权DRF算法进行排序。然后按照最终的排序结果,从小到大对各个框架进行Resource Offer。如下图所示。</p> <p><a href="http://static.oschina.net/uploads/img/201312/18222102_mV4N.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201312/18222102_JNMa.png" width="446" height="362" /></a> </p> <h3>2 mesos资源分配器的实现</h3> <p>Mesos的调度器实现分为两部分,分别是Allocators和sorter,Allocator定义和实现了资源分配器的接口和逻辑。Sorter对资源使用者进行排序,使用具体的资源分配算法来进行排序。</p> <p>Sorter的实现是DRFSorter,DRFSorter使用DRF算法来对资源使用者进行排序。</p> <p>Allocator的实现HierarchicalAllocatorProcess,实现了一个分层的分配器,对framework进行分组,分别在各组之间和组内部使用DRFSorter进行排序。</p> <h4>DRFSorter</h4> <p>DRFSorter通过每个用户的dominant share的值实现对client排序。DRFSorter中的几个概念如下:</p> <p><strong>1、Client</strong>:资源的使用者。定义如下</p> <p>struct Client</p> <p>{</p> <p>&#160; std::string name;&#160;&#160;&#160;&#160;&#160;&#160; //资源使用者名称</p> <p>&#160; double share;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //资源使用者的分配到的资源份额</p> <p>};</p> <p>Client之间的排序是首先比较share值的大小,如果在share相等的前提下则需要比较name的大小。</p> <p><strong>2、Resource</strong>:表示一种资源,包含资源name、资源的值以及资源被那些framework偏好。Pb的定义如下:</p> <p>message Resource {</p> <p>&#160; required string name = 1;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //资源名称</p> <p>&#160; required Value.Type type = 2;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //资源值的类型Scalar</p> <p>&#160; optional Value.Scalar scalar = 3;&#160;&#160;&#160;&#160; //值类型为标量,Cpu和内存的值类型都为标量</p> <p>&#160; optional Value.Ranges ranges = 4;&#160;&#160;&#160;&#160;&#160; //值类型为范围</p> <p>&#160; optional Value.Set set = 5;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //值类型为集合</p> <p>&#160; optional string role = 6 [default = &quot;*&quot;];&#160; //框架对于资源的偏好</p> <p>}</p> <p>Mesos的应用环境是多资源类型的集群环境,所有可以框架申请的是多种资源,通过Resource数组来表示。</p> <p><strong>3、Weight</strong>:各个client的资源分配的权重。定义的类型为double</p> <p>如下图所示,为了对client的进行排序,DRFSorter需要在内部维护了一些信息,见下图:</p> <p><a href="http://static.oschina.net/uploads/img/201312/18222103_nV1Y.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201312/18222103_rK9l.png" width="404" height="337" /></a> </p> <p>dirty:表示DRFSorter的资源分配发生更改,需要重新计算各个client的share值。</p> <p>clients:资源使用者的集合,使用红黑树,按照client的dominant share值进行排序。</p> <p>Resources:此DRFSorter拥有的总资源值。</p> <p>整个DRFSorter的接口有两类,第一类是增加、删除和修改client和resource,在资源发生变化时,DRFSorter会将dirty置为true。第二类是对client进行排序,在dirty为true的情况下,会对所有的client重新计算dominant share的值,然后重新插入集合中,返回排序结果。</p> <p>DRFSorter的核心排序流程如下:</p> <p>| 如果dirty标志位为true</p> <p>&#160;&#160;&#160;&#160;&#160; | 遍历clients集合,计算各个client的share值</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 计算client的各个resource的值占DRFSorter此类型资源总值的比例,</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 找出最大值然后再除以client的权重,就得到了client的share值。</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 公式为:Share = <a href="http://static.oschina.net/uploads/img/201312/18222103_HLYh.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201312/18222103_xmyN.png" width="174" height="26" /></a> ,<a href="http://static.oschina.net/uploads/img/201312/18222103_XP5T.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201312/18222103_DiBN.png" width="21" height="23" /></a> 为client分配到的资源i的值,</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <a href="http://static.oschina.net/uploads/img/201312/18222103_sqbb.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201312/18222104_hxg3.png" width="20" height="22" /></a> 为资源i在DRFSorter中的总值。W为client的权重。</p> <p>&#160;&#160;&#160;&#160;&#160; | 再重新插入client,进行重排序。</p> <p>| 返回排序后的结果。</p> <h4>Allocator</h4> <p>实现了一个分层的分配器,如下图所示,用户可以根据role对framework进行分组,在RoleInfo指定framework group的权重,专门有一个DRFSorter对各个framework分组的资源分配进行排序。然后各个framework group内部还有一个DRFSorter对group内部的各个framework的资源分配进行排序。</p> <p>Allocator的一些概念如下</p> <p><strong>1、Framework</strong>:应用程序框架,向mesos获取集群资源,下发具体的计算任务,是集群的使用者。</p> <p>struct Framework</p> <p>{</p> <p>&#160; hashset&lt;Filter*&gt; filters;&#160; //framework的过滤器</p> <p>&#160; bool checkpoint;&#160;&#160;&#160;&#160; //是否正在进行checkpoint</p> <p>&#160; FrameworkInfo info;&#160;&#160; //framework的信息</p> <p>};</p> <p><strong>2、Slave</strong>:运行在各个集群节点的后台任务,执行具体的计算任务,上报节点的资源和负载。</p> <p>struct Slave</p> <p>{</p> <p>&#160; .............</p> <p>&#160; Resources available;&#160;&#160;&#160; //当前可用的资源</p> <p>&#160; bool whitelisted;&#160;&#160;&#160;&#160;&#160;&#160; //是否在白名单中,如果false,则不能进行resource offer</p> <p>&#160; bool checkpoint;&#160;&#160;&#160;&#160;&#160;&#160; //是否正在checkpoint,如果正在进行checkpoint,是不能进行resource offer</p> <p>&#160; SlaveInfo info;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //slave信息</p> <p>};</p> <p><strong>3、Role</strong>:用于对framework进行分组,可以为每组framework指定一个weight。Role的信息RoleInfo如下。</p> <p>message RoleInfo {</p> <p>&#160; required string name = 1;</p> <p>&#160; optional double weight = 2 [default = 1];</p> <p>}</p> <p><strong>4、Whitelist</strong>:指定了有效的slave,如果制定了白名单,那么白名单内的slave是有效的。</p> <p>过滤器:用于框架对slave的资源进行过滤,可以用于拒绝特定slave上的资源。</p> <p>为了实现资源分配,allocator需要在内部维护如下一些信息,见下图。</p> <p><a href="http://static.oschina.net/uploads/img/201312/18222104_DRbc.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201312/18222104_AwXx.png" width="434" height="402" /></a> </p> <p>frameworks:框架的映射,从framework Id到框架信息的映射。</p> <p>slaves:slave的映射,从slave Id到slave信息的映射。</p> <p>roles:框架分组信息的映射。</p> <p>FrameworkSorters:框架群组内部DRF排序容器的映射。</p> <p>Role Sorter:框架群组之间进行DRF排序的容器。</p> <p>allocator核心的调度逻辑:</p> <p>| 对framework group进行从小到大排序(framework按照role进行分组)</p> <p>| 遍历排序后的framework group</p> <p>&#160;&#160;&#160;&#160;&#160; | 在group组内对各个framework进行排序</p> <p>&#160;&#160;&#160;&#160;&#160; | 遍历排序后的framework</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 遍历slave集合,将满足要求的所有slave的可用资源发送给框架</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 提取slave中role为”*”的所有可用资源资源,”*”表示一般普适的资源。</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 提取与framework group的role相同的所有可用的slave资源</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; (此为提取框架偏好的slave资源)。</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 判断slave资源是否满足条件:</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 过滤资源,如果slave或者framework正在进行checkpoint或者</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 资源被framework中设定的过滤器过滤掉。则放弃资源</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | slave不在白名单中,放弃资源。</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | slave的资源小于最小资源限定,放弃资源。</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 将以上都条件都满足的资源加入到资源结果集合中,</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 并更新slave的可用资源(需要减去已经放入到结果集合中的资源)</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 如果资源结果集合不为空</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 更新资源,即slave中可用资源</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 执行resource offer操作,将资源下发给框架</p> <p>分配器在以下情况下进行resource offer:</p> <p>1、在新的slave加入到mesos集群中。</p> <p>2、在新的framework加入到mesos集群中。</p> <p>3、在定时地执行资源分配,时间可以通过配置文件进行配置。</p> <p>allocator在资源分配时,提供了如下四个机制:</p> <p>1、过滤器:框架可以设置过滤器来拒绝的特定资源。比如framework在某一个slave上多次执行失败,那么framework就可以通过对这个slave设定过滤器来拒绝这个slave上的资源。</p> <p>2、slave的白名单:不在白名单内的slave不参与resource offer。</p> <p>3、slave的最小资源限定:mesos的资源调度等同于一个装箱问题。装箱问题的浪费空间与物体的最大大小和箱子的大小的比率相关,箱子越大物体越小那么利用率越高。但是当一个集群被请求小量资源的任务占满时,那么一个请求大量资源的框架可能会饥饿。为了适应请求大资源任务的框架,mesos通过设定slave节点最小资源限定,来避免在slave上进行offer resource,直到slave上的空闲资源达到最小资源供给大小。</p> <p>4、框架对slave资源的偏好。通过resource中的role参数来实现,可以通过设定slave的资源的role值和以及将框架按照role进行分组,来实现框架群组的专用资源和资源偏好。</p> <p>个人认为Mesos分配器的一些缺陷如下:</p> <p>1、Mesos的resource offer从本质上一种悲观的并发控制,从核心的调度逻辑上我们可以看到,Mesos的每一次调度会一次性地将所有可用的资源都发送给一个框架,在收到框架的响应后,才会返回剩余的资源,继续下一次调度。Mesos的调度性能依赖于框架对resource offer的快速响应。而且mesos没有对resource offer设定一个超时回收机制(个人阅读了0.14版本的mesos代码,没有发现这个机制),如果有一个框架接收了resource offer之后,长时间没有响应,那么整个mesos集群就会发生死锁。</p> <p>2、Mesos实现fairness是通过对框架按照权重和已分配的dominant share资源进行排序来实现的。Mesos如果要实现dominant resource fairness的性能隔离或者sharing incentive依赖于框架的实现,如果有一个贪婪的框架在一次resource offer中占用了大量资源并长时间不释放,那么其他framework就会处于一种饥饿的状态。Mesos适用于那些使用短任务和拥有可扩展的弹性机制的框架。</p> <p>3、mesos不支持框架对资源抢占,框架无法获取整个集群的状态。</p> <p>&#160;</p> <p>作者zy,QQ105789990</p>

© 著作权归作者所有

谈吐鱼
粉丝 37
博文 13
码字总数 41855
作品 0
杭州
程序员
私信 提问
使用 Apache Mesos 打造分布式资源调度系统

Netflix使用Apache Mesos运行了一系列批处理、流式处理,以及服务类型的工作负载。两年多来,我们创建了层出不穷的用例,例如实时异常检测、批处理作业的训练和模型构建、机器学习编排,以及...

花仲马
2016/08/21
3.9K
2
使用Mesos和Marathon管理Docker集群

分布式系统是难于理解、设计、构建 和管理的,他们将比单个机器成倍还要多的变量引入到设计中,使应用程序的根源问题更难发现。SLA(服务水平协议)是衡量停机和/或性能下降的标准,大多数现代...

Endeavour
2015/08/11
1.2W
0
Docker 服务编排 Mesos Swarm Kubernetes 三种模式实践

提起Docker容器化 不得不提服务编排,众所周知目前Docker常用的服务编排模式有三种, Mesos DockerSwarm Kubernetes,下面将详细介绍这三种服务编排模式的架构和环境搭建。 一. Mesos 1.Mes...

MrPei
2019/04/29
71
0
跟我一起学docker(16)--单节点mesos集群

Mesos简介 什么是MESOS? Apache Mesos 是一个集群管理器,提供了有效的、跨分布式应用或框架的资源隔离和共享,可以运行 Hadoop、MPI、Hypertable、Spark。 几个基本概念: Mesos master:负...

IT人故事会
2018/05/15
0
0
颠覆大数据分析之Mesos:集群调度及管理系统

正如前面“Mesos:动机”一节中所述,Mesos的主要目标就是去帮助管理不同框架(或者应用栈)间的集群资源。比如说,有一个业务需要在同一个物理集群上同时运行Hadoop,Storm及Spark。这种情况...

douxn
2015/10/26
234
0

没有更多内容

加载失败,请刷新页面

加载更多

spring-boot-maven-plugin not found的解决方案。

通过IDE创建一个springboot项目, <plugin> <groupId>org.springframework.boot</groupId>//这行红色 <artifactId>spring-boot-maven-plugin</artifactId>//这行红色</plugin> 提示sprin......

一片云里的天空
59分钟前
52
0
OSChina 周三乱弹 —— 我可能是个憨憨

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @宇辰OSC :分享Hare Je的单曲《Alan Walker-Faded(Hare Je remix)》: #今日歌曲推荐# 可以放松大脑的一首纯音乐 《Alan Walker-Faded(Har...

小小编辑
今天
99
0
搞定SpringBoot多数据源(3):参数化变更源

春节将至,今天放假了,在此祝小伙伴们新春大吉,身体健康,思路清晰,永远无BUG! 一句话概括:参数化变更源意思是根据参数动态添加数据源以及切换数据源,解决不确定数据源的问题。 1. 引言...

mason技术记录
昨天
99
0
sql 基础知识

sql 基础知识 不要极至最求一条sql语句搞定一切,可合理拆分为多条语句 1. sql 变量定义与赋值 Sql 语句中,直接在SELECT使用@定义一个变量,如:[@a](https://my.oschina.net/a8856225a)。 ...

DrChenXX
昨天
57
0
MacOSX 安装 TensorFlow

TensorFlow是一个端到端开源机器学习平台。它拥有一个包含各种工具、库和社区资源的全面灵活生态系统,可以让研究人员推动机器学习领域的先进技术的。 准备 安装 Anaconda TensorFlow 安装的...

叉叉敌
昨天
79
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部