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

如何进行Mesos资源调度器的实现分析

如何进行Mesos资源调度器的实现分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易

如何进行Mesos资源调度器的实现分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

1 mesos DRF介绍

mesos调度器是根据DRF(dominant resource fairness)算法实现的。DRF算法背后的直观想法是在多资源类型的环境下,一个用户的资源分配应该由用户的dominant share(主导份额的资源)决定,dominant share是在所有已经分配给用户的多种资源中,占据最大份额的一种资源。

mesos使用resource offers的方式实现各个框架之间的资源分配。Resource offer是多个slave节点上的一组空闲资源。Master根据调度策略来决定提供多少资源给每一个framework,通过以Resource offer的形式发送给发送给框架,然后框架响应Resource offer,确认Resource offer中已使用的资源和返回剩余的空闲资源。

mesos的资源分配器是一个分层的加权max-min fairness的实现。通过抽象了一个role概念,将framework按照role进行分组。那么资源分配就可以分为两层:首先是在各个框架群组间通过加权的DRF算法进行排序;其次在框架群组内部,对各个framework使用加权DRF算法进行排序。然后按照最终的排序结果,从小到大对各个框架进行Resource Offer。如下图所示。

如何进行Mesos资源调度器的实现分析

2 mesos资源分配器的实现

Mesos的调度器实现分为两部分,分别是Allocators和sorter,Allocator定义和实现了资源分配器的接口和逻辑。Sorter对资源使用者进行排序,使用具体的资源分配算法来进行排序。

Sorter的实现是DRFSorter,DRFSorter使用DRF算法来对资源使用者进行排序。

Allocator的实现HierarchicalAllocatorProcess,实现了一个分层的分配器,对framework进行分组,分别在各组之间和组内部使用DRFSorter进行排序。

DRFSorter

DRFSorter通过每个用户的dominant share的值实现对client排序。DRFSorter中的几个概念如下:

1、Client:资源的使用者。定义如下

struct Client

{

  std::string name;       //资源使用者名称

  double share;          //资源使用者的分配到的资源份额

};

Client之间的排序是首先比较share值的大小,如果在share相等的前提下则需要比较name的大小。

2、Resource:表示一种资源,包含资源name、资源的值以及资源被那些framework偏好。Pb的定义如下:

message Resource {

  required string name = 1;              //资源名称

  required Value.Type type = 2;          //资源值的类型Scalar

  optional Value.Scalar scalar = 3;     //值类型为标量,Cpu和内存的值类型都为标量

  optional Value.Ranges ranges = 4;      //值类型为范围

  optional Value.Set set = 5;            //值类型为集合

  optional string role = 6 [default = "*"];  //框架对于资源的偏好

}

Mesos的应用环境是多资源类型的集群环境,所有可以框架申请的是多种资源,通过Resource数组来表示。

3、Weight:各个client的资源分配的权重。定义的类型为double

如下图所示,为了对client的进行排序,DRFSorter需要在内部维护了一些信息,见下图:

如何进行Mesos资源调度器的实现分析

dirty:表示DRFSorter的资源分配发生更改,需要重新计算各个client的share值。

clients:资源使用者的集合,使用红黑树,按照client的dominant share值进行排序。

Resources:此DRFSorter拥有的总资源值。

整个DRFSorter的接口有两类,第一类是增加、删除和修改client和resource,在资源发生变化时,DRFSorter会将dirty置为true。第二类是对client进行排序,在dirty为true的情况下,会对所有的client重新计算dominant share的值,然后重新插入集合中,返回排序结果。

DRFSorter的核心排序流程如下:

| 如果dirty标志位为true

      | 遍历clients集合,计算各个client的share值

            | 计算client的各个resource的值占DRFSorter此类型资源总值的比例,

               找出最大值然后再除以client的权重,就得到了client的share值。

               公式为:Share = 如何进行Mesos资源调度器的实现分析如何进行Mesos资源调度器的实现分析 为client分配到的资源i的值,

               如何进行Mesos资源调度器的实现分析 为资源i在DRFSorter中的总值。W为client的权重。

      | 再重新插入client,进行重排序。

| 返回排序后的结果。

Allocator

实现了一个分层的分配器,如下图所示,用户可以根据role对framework进行分组,在RoleInfo指定framework group的权重,专门有一个DRFSorter对各个framework分组的资源分配进行排序。然后各个framework group内部还有一个DRFSorter对group内部的各个framework的资源分配进行排序。

Allocator的一些概念如下

1、Framework:应用程序框架,向mesos获取集群资源,下发具体的计算任务,是集群的使用者。

struct Framework

{

  hashset filters;  //framework的过滤器

  bool checkpoint;     //是否正在进行checkpoint

  FrameworkInfo info;   //framework的信息

};

2、Slave:运行在各个集群节点的后台任务,执行具体的计算任务,上报节点的资源和负载。

struct Slave

{

  .............

  Resources available;    //当前可用的资源

  bool whitelisted;       //是否在白名单中,如果false,则不能进行resource offer

  bool checkpoint;       //是否正在checkpoint,如果正在进行checkpoint,是不能进行resource offer

  SlaveInfo info;        //slave信息

};

3、Role:用于对framework进行分组,可以为每组framework指定一个weight。Role的信息RoleInfo如下。

message RoleInfo {

  required string name = 1;

  optional double weight = 2 [default = 1];

}

4、Whitelist:指定了有效的slave,如果制定了白名单,那么白名单内的slave是有效的。

过滤器:用于框架对slave的资源进行过滤,可以用于拒绝特定slave上的资源。

为了实现资源分配,allocator需要在内部维护如下一些信息,见下图。

如何进行Mesos资源调度器的实现分析

frameworks:框架的映射,从framework Id到框架信息的映射。

slaves:slave的映射,从slave Id到slave信息的映射。

roles:框架分组信息的映射。

FrameworkSorters:框架群组内部DRF排序容器的映射。

Role Sorter:框架群组之间进行DRF排序的容器。

allocator核心的调度逻辑:

| 对framework group进行从小到大排序(framework按照role进行分组)

| 遍历排序后的framework group

      | 在group组内对各个framework进行排序

      | 遍历排序后的framework

            | 遍历slave集合,将满足要求的所有slave的可用资源发送给框架

                  | 提取slave中role为”*”的所有可用资源资源,”*”表示一般普适的资源。

                  | 提取与framework group的role相同的所有可用的slave资源

                    (此为提取框架偏好的slave资源)。

                  | 判断slave资源是否满足条件:

                       | 过滤资源,如果slave或者framework正在进行checkpoint或者

                            资源被framework中设定的过滤器过滤掉。则放弃资源

                       | slave不在白名单中,放弃资源。

                  | slave的资源小于最小资源限定,放弃资源。

                  | 将以上都条件都满足的资源加入到资源结果集合中,

                     并更新slave的可用资源(需要减去已经放入到结果集合中的资源)

                  | 如果资源结果集合不为空

                       | 更新资源,即slave中可用资源

                       | 执行resource offer操作,将资源下发给框架

分配器在以下情况下进行resource offer:

1、在新的slave加入到mesos集群中。

2、在新的framework加入到mesos集群中。

3、在定时地执行资源分配,时间可以通过配置文件进行配置。

allocator在资源分配时,提供了如下四个机制:

1、过滤器:框架可以设置过滤器来拒绝的特定资源。比如framework在某一个slave上多次执行失败,那么framework就可以通过对这个slave设定过滤器来拒绝这个slave上的资源。

2、slave的白名单:不在白名单内的slave不参与resource offer。

3、slave的最小资源限定:mesos的资源调度等同于一个装箱问题。装箱问题的浪费空间与物体的最大大小和箱子的大小的比率相关,箱子越大物体越小那么利用率越高。但是当一个集群被请求小量资源的任务占满时,那么一个请求大量资源的框架可能会饥饿。为了适应请求大资源任务的框架,mesos通过设定slave节点最小资源限定,来避免在slave上进行offer resource,直到slave上的空闲资源达到最小资源供给大小。

4、框架对slave资源的偏好。通过resource中的role参数来实现,可以通过设定slave的资源的role值和以及将框架按照role进行分组,来实现框架群组的专用资源和资源偏好。

个人认为Mesos分配器的一些缺陷如下:

1、Mesos的resource offer从本质上一种悲观的并发控制,从核心的调度逻辑上我们可以看到,Mesos的每一次调度会一次性地将所有可用的资源都发送给一个框架,在收到框架的响应后,才会返回剩余的资源,继续下一次调度。Mesos的调度性能依赖于框架对resource offer的快速响应。而且mesos没有对resource offer设定一个超时回收机制(个人阅读了0.14版本的mesos代码,没有发现这个机制),如果有一个框架接收了resource offer之后,长时间没有响应,那么整个mesos集群就会发生死锁。

2、Mesos实现fairness是通过对框架按照权重和已分配的dominant share资源进行排序来实现的。Mesos如果要实现dominant resource fairness的性能隔离或者sharing incentive依赖于框架的实现,如果有一个贪婪的框架在一次resource offer中占用了大量资源并长时间不释放,那么其他framework就会处于一种饥饿的状态。Mesos适用于那些使用短任务和拥有可扩展的弹性机制的框架。

3、mesos不支持框架对资源抢占,框架无法获取整个集群的状态。

关于如何进行Mesos资源调度器的实现分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程笔记行业资讯频道了解更多相关知识。


推荐阅读
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
author-avatar
最爱靖哥哥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有