Fuxi ServiceModeJob 多租户(Quota Group) 功能介绍

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 概述 ServiceModeJob(又名:OnlineJob)是fuxi提供的一套准实时计算框架,通过毫秒级的调度开销和网络Shuffle模式为小Job提供更高的性能。目前ODPS对内生产集群约1/3的Job通过ServiceModeJob进行处理,对其中小Job比较多的集群,这个占比会提高到70

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

转载自boyan

概述

ServiceModeJob(又名:OnlineJob)是fuxi提供的一套准实时计算框架,通过毫秒级的调度开销和网络Shuffle模式为小Job提供更高的性能。目前ODPS对内生产集群约1/3的Job通过ServiceModeJob进行处理,对其中小Job比较多的集群,这个占比会提高到70%。
1
2
由于同一套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情况进行分组的计费。如下图所示:
temp4cj

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,而WorkerSpansNumTotalMinQuotaWorkerSpansNum−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,才会重新开始调度。
onlinejob_quota_design
每个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 > createTime
    bool 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数 占比值
2


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

96e17df884ab556dc002c912fa736ef6558cbb51 
相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
5月前
|
分布式计算 大数据 Java
MaxCompute产品使用问题之如何在生产环境中创建external volume,在datawork中执行
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
6月前
|
存储 SQL Apache
阿里云数据库内核 Apache Doris 基于 Workload Group 的负载隔离能力解读
阿里云数据库内核 Apache Doris 基于 Workload Group 的负载隔离能力解读
阿里云数据库内核 Apache Doris 基于 Workload Group 的负载隔离能力解读
|
存储 分布式计算 资源调度
spark on k8s的动态资源分配和external shuffle Service以及任务的队列资源管理
spark on k8s的动态资源分配和external shuffle Service以及任务的队列资源管理
828 0
|
弹性计算 运维 API
运维编排场景系列-----每日统计多Region实例的运行状态
应用场景 一个账号内存在一个Region或者多个Region时,并且每个Region都存在多个实例。需要自定义指定时间来查看所有Region下或者查看指定的部分Region的全部实例的运行状态,并统计出各种实例状态的数量,将输出的报告以钉钉的形式通知指定用户。