解析阿里云分布式调度系统伏羲

云计算并不是无中生有的概念,它是将普通的单台PC的计算能力通过分布式调度的软件连接起来。其最核心的问题是如何把100台、1千台、1万台机器高效的组织起来,灵活的进行任务调度和管理,从而使得可以像使用台式机一样使用云计算。在云计算中,最核心的模块是分布式调度,它好比于云计算的中央处理器。目前,业界已存在多种分布式调度实现方案,如伏羲、Hadoop MR、YARN、Mesos等系统。

阿里云伏羲

伏羲系统是在前人的基础上进行了一系列的改造,首先与YARN和Mesos系统类似,将资源的调度和任务调度分离,形成两层架构,使其具备以下优势:

(1)规模:两层架构易于横向扩展,资源管理和调度模块仅负责资源的整体分配,不负责具体任务调度,可以轻松扩展集群节点规模;

(2)容错:当某个任务运行失败不会影响其他任务的执行;同时资源调度失败也不影响任务调度;

(3)扩展性:不同的计算任务可以采用不同的参数配置和调度策略,同时支持资源抢占;

(4)调度效率:计算framework决定资源的生命周期,可以复用资源,提高资源交互效率。

那现在这套系统已经在阿里集团进行了大范围的应用,能支持单集群5000节点、并发运行10000作业、30分钟完成100T数据terasort,性能是Yahoo在Sort Benchmark的世界纪录的两倍。

伏羲的系统架构

伏羲的系统架构如下图所示,整个集群包括一台Fuxi Master以及多台Tubo。其中Fuxi Master是集群的中控角色,它负责资源的管理和调度;Tubo是每台机器上都有的一个Agent,它负责管理本台机器上的用户进程;同时集群中还有一个叫Package Manager的角色,因为用户的可执行程序以及一些配置需要事先打成一个压缩包并上传到Package Manager上,Package Manager专门负责集群中包的分发。

 

图片一 伏羲的系统架构

集群部署完后,用户通过Client端的工具向Fuxi Master提交计算任务;Fuxi Master接收到任务后首先通知某一个Tubo启动这个计算任务所对应的APP Master;APP Master启动之后,它获知了自己的计算任务,包括数据分布在哪里、有多少的任务需要计算等等信息;接着APP Master会向Fuxi Master提交资源申请,表明它需要多少计算资源;Fuxi Master经过资源调度以后,将资源的分配结果下发给APP Master;APP Master在这个资源的基础之上进行它的任务调度,来决定哪些机器上运行哪些计算任务,并且将这个计算任务发送给对应机器上的Tubo进程;Tubo接受到命令之后就会从Package Manager中下载对应的可执行程序并解压;然后启动用户的可执行程序,加载用户的配置(图中的APP Worker);APP Worker根据配置中的信息读取文件存储系统中的数据,然后进行计算并且将计算结果发往下一个APP Worker。其中,数据的切片称之为Instance或者叫计算实例。

Fuxi Master与Tubo这套结构解决了分布式调度中的资源调度,每个计算任务的APP Master以及一组APP Worker组合起来解决任务调度的问题。

 

任务调度

伏羲在进行任务调度时,主要涉及两个角色:计算框架所需的APP Master以及若干个APP Worker。

 

图片二 伏羲在任务调度时涉及的主要角色

APP Master首先向Fuxi Master申请/释放资源;拿到Fuxi Master分配的资源以后会调度相应的APP Worker到集群中的节点上,并分配Instance(数据切片)到APP Worker;APP Master同时还要负责APP Worker之间的数据传递以及最终汇总生成Job Status;同时为了达到容错效果,APP Master还要负责管理APP Worker的生命周期,例如当发生故障之后它要负责重启APP Worker。

而APP Worker的职责相对比较简单,首先它需要接收App Master发来的Instance,并执行用户计算逻辑;其次它需要不断的向APP Master报告它的执行进度等运行状态;其最为主要的任务是负责读取输入数据,将计算结果写到输出文件;此处的Instance是指输入数据的切片。伏羲任务调度系统的技术要点主要包括数据的Locality、数据的Shuffle以及Instance重试和Backup Instance三点。

数据Locality

数据locality是指调度时要考虑数据的亲近性,也就是说APP Worker在处理数据时,尽量从本地的磁盘读取数据,输出也尽量写到本地磁盘,避免远程的读写。要实现这一目标,在任务调度时,尽量让Instance(数据分片)数据最多的节点上的AppWorker来处理该Instance。

数据Shuffle

数据Shuffle指的是APP Worker之间的数据传递。在实际运行中,APP Worker之间是有多种传递形态的,如一对一、一对N、M对N等模式。如果用户去处理不同形态的传输模式,势必会带来较大的代价。伏羲分布式调度系统将数据传递的过程封装成streamline lib,用户无需关心数据传递的细节。首先MAP进行运算,将结果直接交给streamline,streamline底层会根据不同的配置将数据传给下游计算任务的streamline;然后streamline将接到的数据

交给上层的计算任务。

Instance重试和backup instance

在Instance的运行过程中可能有多种原因导致Instance失败,比如APP Worker进程重启或运行时机器、磁盘发生故障,种种原因都可能导致一个Instance在运行时最终失败;另外APP Master还会监控Instance的运行速度,如果发现Instance运行非常慢(容易造成长尾),

会在另外的APP Worker上同时运行该Instance,也就是同时有两个APP Worker处理同一份数据,APP Master会选取最先结束结果为最终结果。判断一个Instance运行缓慢的依据为:

(1)该Instance运行时间超过其他Instance的平均运行时间;

(2)该Instance数据处理速度低于其他Instance平均值;

(3)目前已完成的Instance比例,防止在整体任务运行初期发生误判。

 

资源调度

资源调度要考虑几个目标:一是集群资源利用率最大化;二是每个任务的资源等待时间最小化;三是能分组控制资源配额;四是能支持临时紧急任务。在飞天分布式系统中,Fuxi Master与Tubo两者配合完成资源调度。

 

图片三 飞天分布式系统中的资源调度

在飞天分布式系统中,Fuxi Master与Tubo两者配合完成资源调度。Tubo是每个节点都有的,用于收集每个机器的硬件资源(CPU、Memory、Disk、Net),并发送给FuxiMaster;FuxiMaster是中控节点,负责整个集群的资源调度。当启动计算任务时,会生成APP Master,它根据自己的需要向Fuxi Master申请资源,当计算完成不再需要时,归还该资源。

飞天分布式调度常用的分配资源策略包括优先级和抢占、公平调度、配额。在实际应用场景中,不同的策略可以配合起来使用。

策略之优先级和抢占

每个job在提交时会带一个priority值(整数值),该值越小优先级越高;相同优先级按提交时间,先提交的优先级高;FuxiMaster在调度时,资源优先分配给高优先级的Job,剩余的资源继续分配给次高优先级Job;

如果临时有高优先级的紧急任务加入,FuxiMaster会从当前正在运行的任务中,从最低优先级任务开始强制收回资源,以分配给紧急任务,此过程称为“抢占”。抢占递归进行,直到被抢任务优先级不高于紧急任务,也就是不能抢占比自己优先级高的任务。

策略之公平调度

公平调度策略是指当有资源时Fuxi Master依次轮询的将部分资源分配给各个Job,它避免了较大Job抢占全部资源导致其他Job饿死现象发生。公平调度首先按优先级分组,同一优先级组内的平均分配,如果有剩余资源再去下一个优先级组进行分配,依此类推。

配额

配额是资源分配时的第三个策略,多个任务组成一个组通常是按照不同的业务进行区分的

例如淘宝、支付宝等;集群管理员会设立每一个组的资源上限,意味着这个组最多能使用这么多CPU、Memory、磁盘等,该上限值称为Quota;每个组的job所分配的资源总和不会超过该组内的Quota,当然如果每一个组内没有用完的Quota是可以分享给其他的组的,会按照Quota的比例进行均分。

 

容错机制

在大规模进程集群中故障是常态,这些常态会来自于硬件,比如主板、电源、内存条;也可能来自软件,比如进程有Bug导致进程Crash,机器故障导致性能慢。因此,分布式调度必须具有容错机制,以保证正在运行的任务不受影响,并对用户透明,能够从故障中恢复过来,保障系统的高可用。下面将从任务调度的Failover和资源调度的Failover两个方面介绍。

AppMaster进程重启后的任务调度Failover

每个计算任务有自己的APP Master,如果APP Master进程发生了重启,那其重启之后的任务调度如何进行Failover呢?这里采用了Snapshot机制,它是将Instance的运行进度保存下来,当APP Master重启之后会自动加载Snapshot以获取之前每个Instance的执行进度,然后继续运行Instance;当APP Master进程重启之后,从APP Worker汇报的状态中重建出之前的调度结果,继续运行Instance。

FuxiMaster进程重启后的资源调度Failover

另一种情况是Fuxi Master发生了Failover。Fuxi Master Failover起来之后需要重建内部状态,该状态通常分为两种:一是Hard State,主要是之前提交的Application的配置信息,如不同的Job配置参数等,它们来自于Fuxi Master写的Snapshot;另一类是Soft State,Fuxi Master会收集来自各个Tubo以及APP Master的信息重建出自己的状态,这些信息包括机器列表、每个APP Master的资源请求以及之前的资源分配结果。

 

图片四 Fuxi Master进程重启之后的资源调度过程

Fuxi Master进程重启之后的资源调度过程如上图所示,首先会从Checkpoint中读取出所有Job的配置信息;同时会收集所有的Tubo以及APP Master上报上来的关于资源分配的结果,如CPU多少、Memory多少等等。

 

规模挑战

分布式系统设计主要目标之一就是横向扩展(scale-out),目前阿里云飞天在2013年时已支撑单个集群5000个节点、并发1万个任务。在做横向扩展设计的时,需要注意两个要点:一是多线程异步;二是增量的资源调度。

多线程异步

多线程异步是编写分布式程序一个非常重要而且常用的技术手段。

 

图片五 RPC通信时采用的四个线程池

在网络通信模块中,每个APP Master都需要跟Fuxi Master进行资源通信,同时也需要跟多个Tubo进行通信以启动它们的APP Worker。APP Master在处理网络通信的过程称之为RPC,RPC通信的时必须采用线程池来处理。如上图中采用四个线程池来处理来处理这些消息。由于Fuxi Master是一个中控节点,而Tubo的数量非常众多,如果将这些消息都在同一个线程池中处理,则Fuxi Master的消息有可能会被大量的Tubo消息阻塞(对头阻塞问题)。为了解决该问题,在伏羲系统当中设立了一个独立的线程池来处理Fuxi Master的消息;另外一个线程池来处理Tubo的消息,将线程池进行分开,也称之为泳道;独立的泳道能有效的解决Fuxi Master的消息被对头阻塞的问题。

伏羲解决规模问题的另一个技术点是增量。目前,伏羲采用增量的消息通信和资源调度,下面通过具体例子,来介绍伏羲所采用的增量资源调度的协议。

 

图片六 伏羲所采用的增量资源调度的协议示例

上图左侧是中控节点Fuxi Master;右边为某一个APP Master,如果说APP Master需要1000份资源,最直接的一种实现方式是直接将“我要1000个资源”这样的消息直接发送给Fuxi Master;Fuxi Master在接到消息之后可能当前的剩余资源只有200份,它将会“我分配给你200”这样的消息发送给APP Master;那APP Master还会继续发送消息“我还要剩余的800”,Fuxi Master回复“此时没有资源,我分配0个给你”;则APP Master在下一次通信的时候需要继续发送“我还要剩余的800”...依此类推,可能某一个时刻Fuxi Master还能分一点资源下来。这就是最直观的全量消息通信,每一次APP Master提出请求的时都要指明它总共需要多少。

而在伏羲的实现当中为了减小通信量和不必要的开销,采用了增量的语义。首先APP Master

发送一个请求“我要1000个资源”,Fuxi Master收到之后将当时空闲的200个资源返回给APP Master;之后APP Master无需再提交请求说我还需要800,因为Fuxi Master会将这1000个请求记录下来等到某一时刻又有更多的资源,比如150个资源释放,它直接将150个分配结果发送给APP Master即可。这期间APP Master无需再发多余的网络通信。

 

安全与性能隔离

在分布式系统当中通常有多个用户在执行自己的计算任务,多个任务之间需要互相隔离、互相不影响。飞天伏羲实现了全链路的访问控制,采用了两种访问控制进行安全的验证,一种是Capability,它是指通信的双方基于私钥进行解密的并验证的一种方式;还有一种称为Token的方式,这种方式需要通信的双方临时生成基于私钥加密的口令,在通信时进行验证。

两种方式最大的区别在于口令生成的时机,Capability方式在是在通信之前就已经加密好;而Token是需要在通信时临时生成。

 

图片七 访问控制的两种安全验证方式

两种方式使用于不同的场景,如上图所示FuxiMaster与Tubo通信采用的是Capability方式,因为这两个角色在集群部署时就已启动,可以事先进行加密生成好Capability;FuxiMaster与APP之间是采用Token的方式,这是因为APP与FuxiMaster进行通信时,当每个任务执行完计算之后会退出;在进程与进程之间,伏羲采用了沙箱的方式将不同的进程进行隔离开、互相不干扰。

除了安全的隔离之外,还需要考虑性能的隔离。目前伏羲采用的几种技术手段:Cgroup(Linux LXC)、Docker container、VM等。这几种的技术的隔离性、资源配额/度量、移动性、安全性的比较如上下图所示,不再一一叙述。

 

图片八 性能隔离的技术手段对比表


伏羲目前采用的隔离技术会基于Docker和LXC混合部署的方式,之所以抛弃虚拟机的方式,是因为其性能损耗太多。当运行计算任务时,如果完全放在虚拟机当中,它的IO以及CPU时间片会受到很大的影响,会降低任务的执行效率。在目前阿里的生产环境中,实践发现基于Docker和LXC的隔离技术已经可以很好的满足需求。

 

分布式调度的发展方向

随着计算能力和数据量的持续增长,分布式调度未来可能朝向以下几个方向发展:

(1)在线服务与离线任务混跑。云计算最终的目的是降低IT成本,最大限度的利用单台PC的CPU处理能力,所以未来的趋势一定是在线的服务与离线的任务能够在同一物理集群上运行从而实现削峰填谷效果、最大化提高集群利用率。但是由于两种不同任务的特点不同,在线运用对于响应时间要求很高,而离线运用则对调度的吞吐率要求比较高,因此混跑会带来性能隔离与资源利用率之间的矛盾。

(2)实时计算的发展,Map Reduce是一个很伟大的框架,但其只为数据量一定的批处理而设计的。随着云计算越来越多的普及,很多计算形态需要实时拿到计算结果,并且其输入数据可能是不间断的。目前,伏羲也已经开发出了实时的计算框架——OnlineJob,它可以提供更快的执行速度。

(3)更大的规模,目前已能够支撑5000台的节点,随着计算量越来越大,客户的需求越来越多,需要进一步优化伏羲系统,能够支撑起1万、5万、10万等更大规模单集群,同时能够支撑更多的并发任务。


本文同步发布在《程序员》上。

时间: 2024-11-08 22:33:04

解析阿里云分布式调度系统伏羲的相关文章

伏羲—阿里云分布式调度系统

今天,大数据已经从概念发展到在很多行业落地生根.广泛用在电商.金融.企业等行业,帮助行业分析数据.挖掘数据的价值.即使在传统的医疗.安全.交通等领域也越来越多的应用大数据的技术.数据.价值二者之间的联系是计算,计算是大数据中最核心的部分.大数据计算就是将原来一台台的服务器通过网络连接起来成为一个整体,对外提供体验一致的计算功能,即分布式计算. 点击查看回顾视频 伏羲系统架构 分布式调度系统需要解决两个问题: 任务调度:如何将海量数据分片,并在几千上万台机器上并行处理,最终汇聚成用户需要的结果?当

深度:阿里云分布式关系型数据库DRDS解析

4月20日,云栖大会深圳峰会顺利召开.阿里云中间件产品经理凤豪为大家深度介绍了阿里云分布式关系型数据库DRDS的发展历史以及DRDS的优势.下面是演讲主要内容整理. 数据库面临的挑战 单机数据库在数据存储容量.访问容量.容灾等方面都会随着业务的增长而到达瓶颈,无论哪一个,对业务来说是一项相当艰巨的挑战.存储容量瓶颈问题,虽然可以通过在一个机器下面挂很多块磁盘,做到10T.20T.30T容量,然后使用一个MySQL实例支撑,但是数据备份.数据管理(DDL).数据检索与更新性能(DML)都会出现大幅

女娲:阿里云分布式一致性协同服务架构详解

他的演讲内容主要分为四个方面:分布式协同服务背景.女娲服务架构以及技术演进.典型女娲服务应用场景分享.全球化架构下的女娲进化,下面是本次分享内容整理.点击查看回顾视频 分布式协同服务背景 分布式协同服务 在大规模云计算场景中,为保障数据分布式一致性,数量众多的计算节点往往依赖分布式协同服务来同步对共享资源的互斥访问,或者依赖分布式协同服务的消息通知功能来协调各自之间动作,使众多节点作为一个整体完成一项工作. 作为云计算分布式系统的核心,在设计分布式协同服务之初需要考虑互斥性.消息通知和扩展性三个

深度解析阿里云存储

 国际知名调研机构Gartner近日公布了2017年全球云计算云存储魔力象限,阿里云的云存储强势崛起成为这一核心领域的前四名. 图1 2017年Gartner全球云存储魔力象限图 在去年首次进入Gartner魔力象限即取得了不错的位置之后,今年阿里云存储再次强势进入公共云存储魔力象限,紧跟Google成为公共云存储厂商中在利基象限中最接近领导者象限的公共云存储厂商,而领导者象限中目前只有AWS和Azure. 图2 2016年Gartner全球云存储魔力象限图 作为国内市场排名第一的云厂商的云存储

阿里云服务器重装系统、快照备份回滚还原、升级降级配置

一般而言,我们站长在选择海外主机.VPS服务器等产品的时候,尤其是非通用面板的时候需要用到中文教程,如果是中文面板基本上我们就算从上到下,从左到右的一个个过一遍也应该能找到需要解决的问题,所以在老左博客中并没有多少分享国内主机面板的教学内容.比如国内很多商家相继推出的云主机产品基本上都是独创(可能是抄袭)的面板,我们很多用户在使用的时候还真找不到解决的按钮在哪里(真有很多新手这样).   这不正好老左手上刚入手一款阿里云ECS(买了一个月,打算是分享常用的教程应用,看看是否有常见的问题),所以对

阿里云主机centos系统如何挂载和扩展多块硬盘(非目录挂载)步骤

  笔记最近买了个阿里云主机(也是听说不错才买的),操作系统是CentOS,后来又新买了硬盘,在新硬盘如何挂载和扩展折腾了不少时间,所幸操作成功,现在把操作步骤记录分享给大家. 新买的阿里云主机默认硬盘没有挂载,如果是挂载那块没有挂载的默认硬盘,可以直接看看阿里云给的教程.但是我感觉硬盘不够用,后来又买了一块硬盘,又不想单独挂载到一个目录里,想扩展现有的硬盘,或者在挂载唯一那块硬盘又想留出以后扩展这块硬盘的余地,那么用阿里云给出的教程就不行了. 折腾了半天,终于挂载成功,不过这样的操作不建议你直

阿里巴巴在京发布阿里云OS手机系统

昨日,搭载"阿里云OS"系统的阿里手机面世.当天,阿里巴巴在京发布阿里云OS手机系统. 距离与宏碁合作阿里手机被谷歌叫停7个月后,阿里巴巴手机操作系统终于发布.昨日,阿里巴巴与国内5家手机厂商合作发布了6款手机,搭载的"阿里手机操作系统"即是阿里云OS的升级版.值得注意的是,这5家手机厂商都是国内二三线品牌,并且均不属于谷歌合作方. "第五大手机操作系统" 昨日,阿里巴巴与卓普.夏新.基伍.康佳.小辣椒等5家终端厂商推出6款阿里云手机.这6款手机

阿里云使用Linux系统应用配置有哪些问题

Linux下如何进行FTP设置 ECS Linux服务器如何配置网站以及绑定域名 Ubuntu安装vncserver实现图形化访问 阿里云Docker镜像库 ECS linux中添加ftp用户,并设置相应的权限 CentOS6.5安装vncserver实现图形化访问 Linux SCP命令复制传输文件的用法 Mysql,phpmyadmin密码忘了怎么办 Linux下l2tp客户端xl2tpd的安装配置 使用SFTP方式传输文件 ECS Linux系统盘网站数据更换至数据盘 WDCP的报错处理

阿里云使用Linux系统有哪些问题

ECS Linux服务器发现未授权登录用户 ECS Linux服务器配置yum源 ECS Linux下解压rar格式的压缩文件 Linux查看实时带宽流量情况 ECS Linux开启swap(虚拟内存) linux磁盘空间用满的处理方法 ECS Linux服务器出现死机或者卡顿现象分析 ECS Linux系统Mysql备份的导入导出 ECS Linux系统查看编码 ECS Linux程序异常退出提示out of memory ECS Linux如何查看端口状态 如何分析php-cgi进程占用cp