免费开通大数据服务:https://www.aliyun.com/product/odps

转载自boyan

概述

ServiceModeJob(又名:OnlineJob)是fuxi提供的一套准实时计算框架,通过毫秒级的调度开销和网络Shuffle模式为小Job提供更高的性能。目前ODPS对内生产集群约1/3的Job通过ServiceModeJob进行处理,对其中小Job比较多的集群,这个占比会提高到70%。


由于同一套ServiceMode服务会有多个Project的Job共用。需要对各个Project的Job进行资源隔离和弹性调度,ServiceMode提供了一套面向多租户(Quota Group)的完整解决方案。

用户场景

ServiceModeJob多租户功能需要解决以下几个用户场景:

  • 不同Project作业之间的资源隔离和分组计费功能
  • 在不同时段,各个Project对ServiceMode服务的使用需求不同,需要提供分时Quota的功能
  • ServiceMode服务的Worker数可能会预先指定,构成一个SharedWorkerPool,各个Quota组的配置情况需要与Worker数保持对应。
  • 根据当前服务的剩余资源和各Quota组的使用情况,对各组Job进行弹性调度,并支持配置基线作业优先级,保证生产基线Job。
  • 鉴于ServiceMode服务All-or-Nothing的调度策略,在Quota组作业调度过程中需要尽可能减小资源调度碎片,提高资源使用率。

针对上述的几个用户场景,我们逐一对功能点进行展开。

分时段的资源隔离和分组计费

每个租户根据自己的需要,配置相应的Quota Group。一个Quota Group包含{MaxQuota,MinQuota}两个配置。MaxQuota表示这个组最大能够持有的资源,MinQuota表示这个组最低期望获得的资源。由于各租户在不同时段对ServiceMode的使用需求不同,因此租户的配置是随时段改变的。
各租户的配置信息将组合成一张出资表,ServiceMode服务将根据出资表中的各组设置进行Job调度和资源分配。一个典型的出资表如下所示:

{"default":{   "group1":{   "GroupId":1,"MaxQuota":5000,"MinQuota":3000},  "group2":{   "GroupId":2,"MaxQuota":5000,"MinQuota":2000}   },  "0-9":{   "group1":{   "GroupId":1,"MaxQuota":15000,"MinQuota":10000},  "group3":{   "GroupId":3,"MaxQuota":3000,"MinQuota":3000}   }
}

整个出资表是一个多级Map结构。第一级的Key是时段,“0-9”表示0点到9点的配置,"default"表示默认配置。第二级的Key是各个QuotaGroup的名字。最后是各个组在不同时段的配置。"GroupId‘是QuotaGroup的标识ID,用于和FuxiMaster角色同步校验QuotaGroup的配置。提交到ServiceMode上的Job,只有所属的Group在该时段有对应的出资才会得到调度。如例子中的group3仅在"0-9"时段有出资,因此在其他时段group3的作业不会得到调度。
一个组的MinQuota配置的越大,调度过程中越容易拿到资源;MaxQuota配置的越大,在空闲资源比较多时调度弹性会越大。在调度过程中,会保证每个组MinQuota的资源需求和MaxQuota的弹性收缩。具体的调度算法将在后续Section进一步展开。
线上集群在ServiceMode服务打开Quota模式以后,可以根据每个QuotaGroup的UsedQuota情况进行分组的计费。如下图所示:

SharedWorker Pool

线上集群的ServiceMode服务Worker数目一般都进行了预先指定。这也是一个分时段的配置,我们称之为WorkerSpans配置,例如下面的配置表示0-9点的Worker数是15000个(WorkerSpansNum=15000WorkerSpansNum=15000),其他时段是5000个。

default:5000,0-9:15000

出资表中每个时段的TotalMinQuota=∑Nn=1(MinQuota)TotalMinQuota=∑n=1N(MinQuota),在设置时必须保证WorkerSpansNum>=TotalMinQuotaWorkerSpansNum>=TotalMinQuota,而WorkerSpansNum−TotalMinQuotaWorkerSpansNum−TotalMinQuota即是该时段的SharedWorkerPool。这批SharedWorker将在调度过程中作为额外的弹性资源分配给需要的QuotaGroup,因此WorkerSpansNum<=TotalMaxQuota=∑Nn=1(MaxQuota)WorkerSpansNum<=TotalMaxQuota=∑n=1N(MaxQuota)。
在实际的场景里,SharedWorkerPool是一个动态grow/shrink的池子。比如大部分组的资源请求都很少,只有一个组的资源请求>MinQuota且<=MaxQuota,这个时候所有的空闲资源都可以认为是SharedWorkerPool。

Quota资源弹性调度算法

每个Quota Group实际使用的资源称为UsedQuota,根据它和MaxQuota,MinQuota的关系,会有以下几种组状态。

enum QuotaState
{Normal, /* UsedQuota <= MinQuota */Overused, /* UsedQuota > MinQuota && UsedQuota < MaxQuota */Drawback, /* UsedQuota >= MaxQuota */
}

当一个组的状态处于Normal时,系统会优先对该组进行调度。如果当前没有来自于Normal组的请求,会调度处于Overused状态的组Job。而对于Drawback组,系统不会响应该组的任何资源请求,直到该组的的Job进入终态释放资源后,组状态迁移回Overused或Normal,才会重新开始调度。

每个Quota Group在调度过程中会对应一个调度队列,每个调度队列内部会基于组状态,作业优先级和提交时间等规则进行排序(排序的规则后面一节会具体展开)。调度规则的伪代码如下:

while (true)
{while (true){1. 选择一个topJob:1.1 如果有EmergentJob,即作为topJob,并reset EmergentJob为空;1.2 否则,从各个group的队列(pri, FIFO)选择队列头job,如果队列头job有基线任务(prodLevel)则优先分配;如果没有则按(usedQuota<minQuota, pri, FIFO)规则进行遍历,可以认为usedQuota越小,作业优先级越高,提交越早的即为topJob:2. 调度topJob:a. freeRes >= topJob.size,则直接assign给topJob,并从对应的group队列中删除。如果在assign时所在group已经是usedQuota > minQuota,则该job加入到toPreemptList(可被抢占的)。freeRes可能有剩余的,continue进入下一轮调度。b. freeRes < topJob.size,如果没开抢占,本轮调度失败,topJob作为EmergentJob。如果开抢占:- 如果topJob所在group是usedQuota < minQuota,就获得抢占资格,去toPreemptList中从前往后抢占直到资源足够topJob的请求。- 否则没有抢占资格,本轮调度失败,topJob作为EmergentJob。}
}

SubmitWindow

无论是Quota Group组内的排序还是挑选topJob都依赖在上文中提到的排序规则。排序规则首先应该考虑的是作业的优先级。但在作业优先级相同的情况下,由于ServiceMode系统的All-or-Nothing调度特性,如果仅仅考虑提交时间可能会产生比较大的调度碎片,使一些规模比较小的Job出现等资源超时的现象(等资源时间超过10秒钟)。
因此,我们结合每个job的规模和提交的时间,提出了SubmitWindow的方法来解决这一问题。根据每个Job提交的时间,以5秒(可配参数)为一个时间间隔,将Job划分到不同的SubmitWindow中。SubmitWindow靠前的Job会优先被调度,而对于SubmitWindow相同的Job,Job的Request资源数目越少的调度优先级越高。

struct SchItemPerJobPriorityComparer
{// priority > submitWindow > aonReqCnt > createTimebool operator()(const SchItemPerJobPtr &job1, const SchItemPerJobPtr &job2) const{   if (job1->priority < job2->priority) return true;else if (job1->priority > job2->priority) return false;else if (job1->submitWindow < job2->submitWindow) return true;else if (job1->submitWindow > job2->submitWindow) return false;else if (job1->mTotalAonReq < job2->mTotalAonReq) return true;else if (job1->mTotalAonReq > job2->mTotalAonReq) return false;else if (job1->submitTime < job2->submitTime) return true;else return false;}
};

总结

目前,ServiceMode多租户功能已经上线了多个生产集群。从实际的上线效果看,多租户功能达到了资源隔离和分组计费等重要作用。我们统计上线前后一个月时间内ServiceMode服务上作业的“等资源超时次数”(即等待资源的时间超过10秒钟),如下图。数据显示quota有助于保障各个租户能更及时地拿到资源,11日升级后等资源超时次数大幅下降,从升级前平均2363次下降到1636次,下降幅度31%。从等资源超时Job/总提交Job数的占比情况分析,也能得出这一结论。
蓝色线:等资源超时Failed的Job数目
红色线:等资源超时Failed的Job数/总提交Job数 占比值

欢迎加入“数加·MaxCompute购买咨询”钉钉群(群号: 11782920)进行咨询,群二维码如下:

 

Fuxi ServiceModeJob 多租户(Quota Group) 功能介绍相关推荐

  1. RocketMQ Topic/Group/Tags介绍

    Topic 功能介绍 Topic是RocketMQ里对消息的一级归类. RocketMQ通过Topic完成消息的发布和订阅.消息生产者将消息发送到Topic中,而消息消费者则通过订阅该Topic来消费 ...

  2. RedisManager使用手册(六)-- 监控功能介绍

    本章介绍RedisManager Monitor功能 如何接入已经存在的集群 如果您已经有正常使用的 Redis 集群,可以接入 Redis Manager 进行集群监控与集群管理.如图所示:点击页面 ...

  3. Java 14 新功能介绍!

    Java 14 新功能介绍! Java 14预定于3月17日发布.那么,14版究竟有什么新功能,对于整天写代码.维护代码的Java开发者来说,哪些功能最有用呢? 作者 | Raoul-Gabriel ...

  4. vSAN 6.7培训_第1章-Virtual SAN各版本功能介绍

    vSAN 6.7培训_第1章-Virtual SAN各版本功能介绍 2019年10月8日 by 何 坤源 http://www.bdnetlab.com/?p=996 1,865 Views Virt ...

  5. OpenSearch最新功能介绍

    **摘要:**阿里云开放搜索(OpenSearch)是一款结构化数据搜索托管服务,其能够提供简单.高效.稳定.低成本和可扩展的搜索解决方案.OpenSearch以平台服务化的形式,将专业搜索技术简单化 ...

  6. Java 17 新功能介绍(LTS)

    点赞再看,动力无限.Hello world : ) 微信搜「 程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. Ja ...

  7. LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(四)之ASP.NET SignalR核心功能介绍

    前言 本系列文章特点:使用ASP.NET SignalR和LayIM快速入门对接,实现一对一聊天,群聊,添加聊天群组,查找聊天记录等功能.源代码不包含LayIM的源代码,因为官方并没开源属于收费资源, ...

  8. 笔记本各种接口功能介绍

    笔记本各种接口功能介绍   其实当我们购买笔记本时很少考虑到接口问题,并且有些消费者认为USB和网口都有就OK.但是我要告诉大家的是除了我们经常要用的USB接口和网口之外,其他接口的配备也是很重要的. ...

  9. Marathon主要功能介绍(一)

    [摘要]Marathon是一个成熟的,轻量级的,扩展性很强的Apache Mesos的容器编排框架,它主要用来调度和运行常驻服务(long-running service),提供了友好的界面和Rest ...

最新文章

  1. MySQL查询count(*)、count(1)、count(field)的区别收集
  2. layui 传递前端请求_layui弹出层如何传值?
  3. httpServlet,java web后台服务
  4. 为什么iPad-WIFI版无3G模块也可以准确定位?
  5. android 绘制按钮,Android:使用xml定义创建一个三角形的按钮(可绘制)
  6. hadoop2.0初识1.2
  7. SQL 2008镜像配置
  8. 使用Flex4画图形
  9. python pyspark用法
  10. CentOS部署OpenStack过程-网络服务
  11. android adb驱动win7,win7 64位adb驱动怎么安装_win7安装abd驱动的方法图文步骤
  12. 决策树CART 代价复杂度剪枝
  13. 如何使用JGIT在远程仓库获取提交详情记录
  14. 简单几步解决ie打不开闪退的问题 亲测有效
  15. Java线上兼职家教_基于ssh/bs/java/asp.net/php/web的兼职家教网站
  16. 如何把html文件格式转为视频格式,如何将qlv格式转换成mp4-太平洋软件资讯-太平洋电脑网...
  17. 嵌入式系统和物联网中的软件安全
  18. OpenGL矩阵运算——GLM库的使用
  19. 学习C++:实践者的方法
  20. JS中设计模式的深入理解

热门文章

  1. VC++实现QPSK调制
  2. UEStudio使用技巧三则
  3. 使用win32 API 下载文件
  4. 混淆工具Dotfuscator基本使用
  5. WPF基础入门2 - WPF窗口类和垂直布局面板基本使用
  6. 超图桌面版加载obj 3D模型 - 2
  7. Flutter 案例学习之:GridView
  8. 习题元祖与字典的值交换
  9. 【九度OJ】题目1078-二叉树遍历
  10. C#_细说Cookie_Json Helper_Cookies封装