首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

海量闲置算力的调度设计与实现

4888字/9min

自从有了计算机以来,算力的角逐就已经开始,从1942年Atanasoff-Berry Computer(ABC)第一台超级计算机出现,几十年来计算在规模、性能以及计算的通用性等各个方面都有了突飞猛进的发展。从企业内部的单机系统,私有云、公有云,算力从各个分散的点逐渐整合为规格更为统一的数据中心,同时分布式计算也逐步发展为解决如何处理互联网产生的大量数据的重要途径。

公有云等云计算基础设施和服务出现以后,对于有计算和存储需求的用户来说,越来越不关心底层网络,服务器等硬件基础设施,只需要根据使用云计算服务,按使用量或者是使用时长付费,不断降低用户的使用门槛,同时集中统一化的云服务为用户提供了更加稳定的环境。在上云趋势之下,越来越多的私有云和中小企业用户逐渐把服务迁移到公有云,公有云成为企业级OS的趋势。通过云上的各种服务,对于初创公司相比自建私有云,产品研发周期大大缩短,可能直接影响着用户商业化周期。

从数据中心出现开始,私有云到公有云,数据和计算逐渐越来越往中心靠拢,云服务逐渐从以人为中心设计的云(例如:web service )发展到下一个时代,设计以机器为中心云(如:边缘计算、IOT PAAS),以支持更大规模计算和调度。和公有云互补的是边缘计算,边缘计算在网关层面做简单处理之后,大部分数据还是会回归中心的公有云,是中心云的扩展,思想为把中心云服务部分计算推到边缘,网关节点一般为更靠近某个区域的数据中心服务器。

在大量智能设备出现和大量空闲算力的今天,Gravity把空闲算力整合成标准化的计算单元VCU,通过P2P的NFV网络,把异构的算力组成虚拟数据中心,通过一个去中心化的调度网络在异构的节点(包括:手机、智能设备、矿机、PC、路由器等)组成一个更为分散和具有资源和作业调度能力的边缘云基础设施,把边缘设备组成一个具有大数据计算和存储能力的分布式计算网络,把数据中心的计算拓展到边缘云,也是现有云计算的强有力互补。

在整合闲置算力提供大数据计算的过程中,

我们面临着几大挑战

计算节点平台,OS和计算能力异构

节点分散在距离用户较近的位置,没有数据中心级别的网络环境

未来的节点规模大,百万级

动态化的节点拓扑(相对数据中心节点拓扑来说)

在业界也出现了很多benchmark来测评相关指标。比如Sort Benchmark中的TeraByte Sort,主要面向大数据领域,曾经是巨头们争相追逐的指标。这种评测是典型考验调度能力的方法,优异的调度能力会在指定数据和算法任务中胜出。我们从现在主流的计算和资源调度进行一个对比,来说明我们是怎么解决以上问题的。

常见的调度模型分为:

来源:Omega: flexible, scalable schedulers for large compute clusters论文

Monolithic统一调度架构

单一的调度器通过集群状态信息,负责统一的资源和任务的调度,许多调度系统最初被设计为这种模式,这种架构一致性强,扩展性较差,在集群规模增大时,可用性和处理能力可能会随之下降。

Two-Level两级调度

通过资源动态划分,使用中央协调器来确定每个子集群可以分配的资源,每个子调度器不具备全局资源视图,可能造成资源使用量不均衡等问题。代表性的两级调度有Mesos和Yarn(有争议)

Shared State 共享状态调度

调度系统同时存在多个调度器,调度器共享全局资源视图,通过乐观锁机制,调度冲突概率大,比如Borg和Omega.

主流开源调度器的

横向对比

Yarn

Yarn是Hadoop里的调度系统,主要面向大数据计算。由Resource Manager、NodeManager、Container和Application Master组成,是一个典型的多级调度。来源于早期的原生MapReduce任务的调度,目前可以支持Spark、Flink等运行在Hadoop集群。

Yarn的NodeManager复杂宿主机管理,其中的Container主要是进程级的管理,运行MapReduce任务时会启动TaskManager和TaskExector进程。

Yarn 启动任务时会由 Resource Manager 指定一个 Node 启动 Application Master,成为二级管理者,来负责子作业运行管理,比如 MapReduce 的 JobManager 或者 Spark 的 Master.

Yarn默认使用公平调度策略,用队列形式管理任务,队列可以嵌套,也可以配置优先级。总体来说Yarn适合大数据场景,管理迭代计算比较有优势。

通过federation支持节点量级10k~100k(理论值)

图片来源:https://hadoop.apache.org/

Mesos

通过将机器、CPU、内存和存储等其他计算资源抽象出来,agent向master汇报节点资源情况,Master根据策略决定将Resource Office给不同的调度框架。

可以采用一主多备,通过Zookeeper来做分布式协调,节点通过Slave的方式加入到集群中,支持大约10K级别节点规模。

Kubenetes

通过Minon节点汇报节点资源状态到Master, Controller Manager负责管理Cluster的各种资源,Scheduler通过Cluster的拓扑结构进行Pod调度,无状态ApiServer 则负责对外进行调用理论支持5K节点规模。

图片来源:https://kubernetes.io/

上述的调度系统都是假设节点都在数据中心,网络和设备可用性很高,而且都是G以上网络互连且能IP直通的环境,节点拓扑相对静态,扩展性都是在 10K 规模的节点集群,不能满足我们边缘云计算的业务背景。

而 Gravity 需要解决节点平台和 OS 算力异构的问题(比如:PC、手机、矿机、智能盒子等),节点动态加入动态扩容和离开(共享设备随时可能加入和离开网络),由于边缘和闲散算力计算资源都相对较弱,需要满足海量设备的资源和作业调度。

以下是 Gravity 的实现方案及相关产品:

Gravity PMR (PMR)

PMR 是我们目前已经实现,并且提供公测的调度,面向MapReduce大数据处理任务,适合迭代的批量计算。由于Gravity是利用公网的共享设备组成计算网络,网络和设备稳定性以及异构情况都会很复杂,支持的单集群节点规模也会提升两个数量级。

Gravity MapReduce 的实现方案

1.节点比较分散,一般家用 PC 或者手机网络都是在路由器 NAT 之后,没有对外固定的公网 IP,同时数据中心之外的闲置或边缘设备数量很大

我们通过节点间的P2P网络,对于在同一个局域网内的节点通过广播互相通信,对于不在同一个网络中的其他对等点通过NAT穿透,构建一个去中心化的计算网络,降低了通信成本,不需要使用固定的公网IP,通过节点id唯一标示一个节点,节点网络统一,局部是自治网络,通过平衡策略,每一个点不会接收大量节点的连入,横向扩展能力强。

2.动态化的节点拓扑和自平衡网络

节点启动时,节点根据VRF和Bully选举算法,会有部分节点自动竞选成为作业调度节点,其他节点成为作业执行节点。

首先网络中所有Node都具备任务执行和调度能力,所有节点都是普通的Node角色,在启动过程中,自动转化为Idle,在Idle状态下,根据VRF和Bully选举算法,在一个随机超时之后,手中持有大部分选票的节点胜出,进入GP-Mid状态。此阶段是一个中间状态,节点只具有参与第二轮选举的权利,其余节点回到Node状态,第二轮在GP-Mid选中节点中,通过VRF生成的选票,通过Bully选举,选出满足网络初始状态的所有Ggroup,其余节点进入Gant状态。所有Group状态的节点,在当选之后,会受到随机选择的多个备选Ggroup检测,同步状态信息。当Group宕机,所有备选会重新选举,并接管状态。在新的节点加入过程中,如果没有找到相应的Group节点接受,则和其他没有被接受的节点进入选举状态,最终产生新的Group节点。

网络自平衡策略,红色为Job调度节点,蓝色为作业Task执行节点,当Job提交较多,用户等待时间较长时,所有Job调度器会通过协调者从Task执行节点中选举出新的 Job 调度节点。当Job减少Task较多的情况下,超过一定时间没有接收到Job的调度节点,会自动转换为Task执行节点。

3.工作量验证和容错机制

其中红色节点为当前Job分发节点,蓝色节点为当前Job执行task节点,黄色节点为红色节点的检测者,黄色节点之间互相不知道彼此的作业信息,他们并行从红色节点获取作业的状态汇报,当检测到当前Job调度器宕机或者停止响应时,黄色节点之间通过选举模块,选出接管者和检测者。

蓝色节点彼此之间不知道互相的状态信息,如果检测者或者Job调度器发现其中部分节点作业心跳异常或者执行速度慢于其他蓝色节点很多,则会推迟执行,选择一个蓝色节点并执行此Task,最后谁最快返回谁获得计算证明。

4.解决设备和节点计算能力异构的问题

我们通过一个标准化的benchmark测试,评估不同设备的算力级别,根据我们逻辑划分的最小计算单元VCU,来预估一个设备所能并发接收的Task数量和每个Task所能执行的数据量。用户可以通过参数修改并发量,但是在常规情况下不建议用户修改,修改可能导致节点负载过大等,在task执行过程中相比其他节点慢,导致推测执行,拿不到响应的计算激励。

关键点:

在我们整个网络中,所有节点都为全功能节点,在通过相应的任务负载的情况下,网络中的调度器数量和计算节点是动态调整的(适者生存),没有一个全局中心节点,可以水平扩展。

网络中所有调度器通过DHT方式寻址,每个调度器负责一定数量的计算节点,并且能达到跨调度器的资源请求。同时所有调度节点都受多个备用调度节点监测(局部共识)。

任务计算节点如果存在异常,比如并发设置不合理等,会通过推测执行,选择其他节点同时计算,先完成的将取代慢的(弱肉强食)。

要解决边缘云计算的问题,利用闲置算力组成计算网络,现有的数据中心级别的作业和资源调度是很难解决大规模,动态节点拓扑,网络节点异构的问题,以上就是我们的一些思考和实践。基于Gravity作业调度之上,已经支持了MapReduce作业调度,跨手机、PC、盒子等异构分散设备的计算网络,欢迎大家关注公众号参与测试。

写在最后

如果你也对世界充满好奇和探索精神,加入我们!Gravity分布式计算技术社区是一个长期关注大数据和区块链底层技术发展的社区,会定期举办社区活动,讨论底层大数据和区块链技术的发展。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190322A0G9PJ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券