presto-多租户资源管理-阿里云开发者社区

开发者社区> 陈江@阿里> 正文

presto-多租户资源管理

简介: presto资源管理介绍 oomKiller presto会监控sql整个生命周期资源的使用(mem,cpu),worker也会周期性汇报自身mem使用状况,当worker的free memory降为0及以下时,触发集群oom逻辑。
+关注继续查看

presto资源管理介绍

oomKiller

presto会监控sql整个生命周期资源的使用(mem,cpu),worker也会周期性汇报自身mem使用状况,当worker的free memory降为0及以下时,触发集群oom逻辑。

  • 正常场景下,ClusterMemoryManger也会周期性检查query 内存使用量,如果超过2TB,直接杀死。
  • oom场景下,lowMemoryKiller 会选择内存使用量最大的query,然后将其杀死。

资源组(resource-group)

可按用户划分资源组,可简化模型,一个组管理一个用户所有查询。 每个 Group 可以自定义了三项数据

  • CpuQuota:使用cpu时间片配额,分软硬限
  • MemoryQuota:使用内存配额,仅有硬限。
  • query并发数:一个组可以并发执行查询个数。

从三个维度限制一个 Group 的最大资源使用量, 同时可以配置一系列的选择器, 每个选择器可以根据请求上下文比如用户名, 来源,客户端tag等信息唯一确定归属于某个 Group, 因此该框架其实是具备提供多租户隔离的能力的.

示例配置


https://prestodb.io/docs/current/admin/resource-groups.html

presto


执行主要流程:

  • 先判断query属于哪个资源组
  • 看看当前组有没有quota执行该query,有直接运行,没有则塞入队列,等待资源。
  • 执行的query周期性汇报资源使用情况,资源组更新quota,减去已使用部分。当quota减为0了,新进入的查询只能进入等待队列,等待有quota了,被manager调度执行。该资源组处于封禁状态,等待query执行完解禁。
  • mananger轮询有quota的组,调度组里面处于队列中的query。

公平调度

sql调度层面

默认情况下manager采用round-robin公平调度group,当然你也可以配置权重,让一些group得到更多的调度机会。group内部采用fifo方式调度query。group资源如果超阈了,短时间会封禁,不再继续发起query执行,直到先前query执行完。

task执行层面

Presto在每个Worker节点上调度许多并发任务,以实现多租户,并且使用了一个协作的多任务处理模型。任意给定的split只能在一个线程上最多运行1秒钟,之后必须放弃该线程并返回队列中。当输出缓存已满(下游阶段无法足够快地消耗数据),输入缓存为空(上游阶段可能无法足够快地生成数据),或系统内存不足时,本地调度器会在当前任务CPU运行时间(指运行1秒中)到达之前切换到另一个任务。这样释放了那些正在处理split的线程,帮助Presto最大限度的利用CPU,从而适应不同的查询。
当一个split放弃当前的线程时,查询引擎会确定一下个要被执行的task(与一个或多个split相关联)。Presto并没有提前预测完成一个新的查询所需的资源,而只是使用任务的总CPU时间,将一个多级优先队列划分成五个层级。随着task累积的CPU时间越来越多,它将被划分到更高的级别。每个级别都指定了一个可配置的CPU时间。在实际应用中,要在任意负载下公平的协调多任务的处理是相当有挑战性的。不同的split使用的IO和CPU的差异性相当的大,即便在相同的任务中也是如此,而复杂的函数(如正则表达式)相对于其他的split可能会消耗更多的线程时间。而某些Connector不提供异步的API,因此有的工作线程会被保留数分钟。
在处理这些约束条件时,调度程序必须是自适应的。系统提供了低成本的信号量,因此在一个operator中可以暂停长时间的运算。如果operator中的停止时间超过特定的值,调度器会将实际的线程时间计入当前task,并且会暂时调低这个任务将来的执行频率。这种自适应的特性允许我们在Interactive Analytics 以及Batch ETL的案例中处理不同类型的查询,其中presto可以为消耗最低资源的查询提供更高的优先级。我们也可以这样来理解,用户只希望低成本的查询可以被快速执行,而不必担心高成本的查询的运转时间。同时运行更多的查询,即使以牺牲更多上下文切换为代价,也可以减少总的排队时间,因为低成本的查询会被快速的执行并退出。

资源隔离

无资源隔离,worker上的TaskExecutor线程被每个task共享使用。从task视角,底层线程都是共用的,做不到物理意义上的隔离。

结论及潜在问题

资源管理三个核心问题

  • 避免过度分配:

    • presto没有cbo,无法预估一个查询资源使用情况,没法避免过度分配    
  • 资源隔离:一个worker上的任务可能会争夺资源并而相互干扰。如何相互间互不干扰至关重要。

    • presto共享任务线程模式,无法真正意义上做到资源隔离
  • 调度不同的负载:不同用户对DLA使用情况不尽相同,query有大有小,如何让不同负载用户查询得到公平调度。

    • 使用一个用户一个资源组模式,query能得到公平调度,基本不存在大查询饿死小查询问题
    • 当大家共用一个全局资源组,查询是fifo方式调度,查询多的用户是会饿死小用户。

潜在问题

  • presto的资源组管理是一个前置quota检查,执行前无法判断其资源使用情况。放行后,可能是大query,资源不够,这属于过度分配问题。

    • 只在请求提交阶段做了隔离, 且没有预估请求的资源使用量. 即只考虑请求所属 Group 当前的资源占用量是否超限, 未超限则放行, 不考虑放行后未来执行过程中资源使用是否会超限
  • cpu使用是延时反馈, 是在请求结束后再反馈 CPU 使用, 但增加 CPU 资源是实时的
  • 集群资源使用率问题

    • 一个用户对应资源组quota是硬配,不可动态调整,容易导致集群资源使用率低。
    • 如果每个资源组quota配额都很高,超出集群负载,超频调度SQL执行,导致oomkiller频繁杀大sql。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Tablestore入门手册-数据管理-GetRow
GetRow接口概述     GetRow接口用于读取一行数据,是Tablestore最基础的API之一。官方提供了Java、Go、Node.js、Python、PHP、C#、C++ SDK。     本文以Java代码为例,对GetRow接口进行详细说明。 基本使用说明 参数说明 参数名称 是否必填 参数说
339 0
ECS7天实践进阶训练营Day1:使用阿里云ECS,快速搭建、管理VuePress静态网站
ECS7天实践进阶训练营Day1:使用阿里云ECS,快速搭建、管理VuePress静态网站
106 0
DataStreams+logstash+ILM进行日志定时删除,节省硬盘资源
目前所有的K8S上的容器日志都被收集到了我们的ELK上,随着时间的推移,ELK上的日志所占的存储空间越来越多,我们需要一个定时清理的策略,以节约硬盘资源。 我们主要配置以下ELK里的这几个地方 1.通过kibana新增一个lifecycle policies 2.通过kibana新增一个index template,注意配置DataStreams 3.logstash 的logstashPipeline 4.filebeat的filebeat.yml文件
30 0
android 中resources管理
主要存在于res/value文件夹中 定义: dimen.xml:主要用于设置像素默认值  res/values/dimens.xml 12sp13sp  40dip 45dip 代码使用: int width=getContext().
467 0
关于《RedHat Linux用户基础》和《RedHat Enterprise Linux系统管理》
这两本书的课后习题书本并没有提供答案,好在红帽官方提供了答案的PDF文件,如果需要的可以去官方下载,地址是http://www.redhat.com.cn/training/academy/,在最下面的红帽学院官方指定教材的下面的两个链接就是。
1221 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
7734 0
PgSQL · 内核开发 · 如何管理你的 PostgreSQL 插件
一.背景 我们都知道 PostgreSQL 提供了丰富数据库内核编程的接口,允许开发者以插件的形式把功能融入数据库内核。 PostgreSQL 提供了一个插件管理模块,用于管理用户创建的插件。 本文给大家介绍 PostgreSQL 插件管理模块,帮助大家管理自己的插件。 二.PostgreSQL的插件内容 通常一个 PostgreSQL 内核插件包括下面的部分 1. 包含功能的逻辑的动
1295 0
Spring事务管理—aop:pointcut expression解析
  先来看看这个spring的配置文件的配置:     <!-- 事务管理器 -->  <bean id="transactionManager"   class="org.springframework.orm.hibernate3.HibernateTransactionManager">   <property name="session
1310 0
Tablestore入门手册--数据管理
为了让表格存储 Tablestore 用户更好的了解产品数据管理能力以及SDK使用,本文将结合代码讲述数据管理的功能与使用方式。本文仅讲述主表数据的管理使用,并非Tablestore全部的数据管理能力。
1750 0
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 32 章 回归测试_32.4. TAP Tests
32.4. TAP Tests 各种测试,尤其是src/bin下的客户端程序测试, 都使用Perl TAP工具,并使用Perl测试程序prove运行。 你可以通过设置make变量PROVE_FLAGS 向prove传递命令行选项,例如: make -C src/bin check PROVE_FLAGS='--timer' 详见prove的手册页。
936 0
+关注
陈江@阿里
从业于BAT等公有云部门,分布式存储领域专家
21
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载