大数据StarRocks(八):资源隔离实战

在这里插入图片描述

前言

自 2.2 版本起,StarRocks 支持资源组管理,集群可以通过设置资源组(Resource Group)的方式限制查询对资源的消耗,实现多租户之间的资源隔离与合理利用。在 2.3 版本中,StarRocks 支持限制大查询,集群可以进一步控制大查询对资源的消耗,避免少数的大查询耗尽系统资源,进而影响系统稳定性。StarRocks 2.5 版本支持通过资源组对导入计算进行资源隔离,从而间接控制导入任务对集群资源的消耗。
通过资源隔离功能,您可以将 BE 节点的计算资源划分成若干个资源组,并且为每个资源组关联一个或多个分类器(Classifier)。根据在分类器中设置的条件,系统将匹配查询任务的对应信息。当您发起查询任务时,分类器会根据查询任务的相关信息进行匹配。其中匹配度最高的分类器才会生效,系统则会根据生效的分类器所属的资源组为查询任务分配资源。

资源隔离功能支持计划
image.png

基本概念

资源组

通过将 BE 节点划分为若干个资源组 (resource group),系统在执行相应资源组的查询任务时,会按照为该资源组划分的资源配额(CPU 及内存)分配查询资源。

资源组设置以下资源限制

cpu_core_limit

该资源组在当前 BE 节点可使用的 CPU 核数软上限,实际使用的 CPU 核数会根据节点资源空闲程度按比例弹性伸缩。
取值为正整数。取值范围为 (1, avg_be_cpu_cores]。
** avg_be_cpu_cores 表示所有 BE 的 CPU 核数的平均值。**
image.png
说明:
案例一
在 64 核的 BE 节点中设置三个资源组 rg1、rg2、rg3,**cpu_core_limit **分别设置为 8、24、32。
当在该 BE 节点满载时资源组 rg1、rg2、rg3 能分配到的 CPU 核数分别为
BE 节点总 CPU 核数 ×(8/64)= 48
BE 节点总 CPU 核数 ×(24/64)= 144
BE 节点总 CPU 核数 ×(32/64)= 192

如果当前 BE 节点资源非满载,rg1、rg2 有负载,rg3 无负载,则 rg1、rg2 分配到的 CPU 核数分别为
BE 节点总 CPU 核数 ×(8/32)= 96
BE 节点总 CPU 核数 ×(24/32)= 288

案例二、
在 64 核的 BE 节点中设置三个资源组 rg1、rg2、rg3,**cpu_core_limit **分别设置为 24、48、56。
当在该 BE 节点满载时资源组 rg1、rg2、rg3 能分配到的 CPU 核数分别为
BE 节点总 CPU 核数 ×(24/128)= 72
BE 节点总 CPU 核数 ×(48/128)= 144
BE 节点总 CPU 核数 ×(56/128)= 168

如果当前 BE 节点资源非满载,rg1、rg2 有负载,rg3 无负载,则 rg1、rg2 分配到的 CPU 核数分别为
BE 节点总 CPU 核数 ×(24/72)= 128
BE 节点总 CPU 核数 ×(48/72)= 256

cpu_core_limit 不能大于BE 的 CPU 核数的平均值,理论上来说超出平均值设置无效,相当于无限制

mem_limit

该资源组在当前 BE 节点可使用于查询的内存(query_pool)占总内存的百分比(%)。取值范围为 (0,1)
image.png

concurrency_limit

资源组中并发查询数的上限,用以防止并发查询提交过多而导致的过载。只有大于 0 时才生效,默认值为 0。

大查询限制进一步对资源组进行如下的配置

big_query_cpu_second_limit:
  • 大查询任务可以使用 CPU 的时间上限,其中的并行任务将累加 CPU 使用时间。单位为秒。只有大于 0 时才生效,默认值为 0。
big_query_scan_rows_limit
  • 大查询任务可以扫描的行数上限。只有大于 0 时才生效,默认值为 0。
big_query_mem_limit
  • 大查询任务可以使用的内存上限。单位为 Byte。只有大于 0 时才生效,默认值为 0。

当资源组中运行的查询超过以上大查询限制时,查询将会终止,并返回错误。您也可以在 FE 节点 fe.audit.log 的 ErrorCode 列中查看错误信息。

big_query_mem_limit 和 mem_limit对查询限制的影响

BE节点内存
image.png

下面展示将big_query_mem_limit和mem_limit设置不同值对查询的影响

  • big_query_mem_limit > mem_limit

image.png
设置mem_limit=693M,big_query_mem_limit=8G
image.png
执行查询时,包内存超限,瓶颈在mem_limit
image.png

  • big_query_mem_limit < mem_limit

image.png
设置mem_limit=8G,big_query_mem_limit=693M
image.png
执行查询时,包内存超限,瓶颈在big_query_mem_limit
image.png

  • big_query_mem_limit = mem_limit

image.png
设置mem_limit=10G,big_query_mem_limit=10240M
image.png
执行查询成功

以上实战足以证明mem_limit是基础的内存限制,而big_query_mem_limit是对查询内存进行进一步限制,若big_query_mem_limit和mem_limit相等,big_query_mem_limit设置限制相当于无效;因此big_query_mem_limit小于mem_limit时,对大内存查询进一步限制才有意义。

设置big_query_scan_rows_limit大小对查询的影响

在这里插入图片描述

设置big_query_scan_rows_limit=1000
image.png
执行查询时报错误,实际需要扫描12152行的数据,但扫描行数限制1000,所以查询报错。

分类器

可以为每个资源组关联一个或多个分类器。系统将会根据所有分类器中设置的条件,为每个查询任务选择一个匹配度最高的分类器,并根据生效的分类器所属的资源组为该查询任务分配资源。
分类器可以包含以下条件:

  • user:用户名。
  • role:用户所属的 Role。
  • query_type: 查询类型,目前仅支持 SELECT。
  • source_ip:发起查询的 IP 地址,类型为 CIDR。
  • db:查询所访问的 Database,可以为 , 分割的字符串。

系统在为查询任务匹配分类器时,查询任务的信息与分类器的条件完全相同,才能视为匹配。如果存在多个分类器的条件与查询任务完全匹配,则需要计算不同分类器的匹配度。其中只有匹配度最高的分类器才会生效。

匹配度的计算方式如下

  • 如果 user 一致,则该分类器匹配度增加 1。
  • 如果 role 一致,则该分类器匹配度增加 1。
  • 如果 query_type 一致,则该分类器匹配度增加 1 + 1/分类器的 query_type 数量。
  • 如果 source_ip 一致,则该分类器匹配度增加 1 + (32 - cidr_prefix)/64。
  • 如果查询的 db 匹配,则匹配度加 10。

例如
多个与查询任务匹配的分类器中,分类器的条件数量越多,则其匹配度越高。

-- 因为分类器 B 的条件数量比 A 多,所以 B 的匹配度比 A 高。
classifier A (user='Alice')
classifier B (user='Alice', source_ip = '192.168.1.0/24')

如果分类器的条件数量相等,则分类器的条件描述越精确,其匹配度越高。

因为分类器 B 限定的 `source_ip` 地址范围更小,所以 B 的匹配度比 A 高。
classifier A (user='Alice', source_ip = '192.168.1.0/16')
classifier B (user='Alice', source_ip = '192.168.1.0/24')

隔离计算资源

开启资源组

通过设置相应会话变量开启 Pipeline 引擎以及资源组功能。

SET enable_pipeline_engine = true;
SET enable_resource_group = true;

说明:如果需要设置全局变量,需要运行 SET GLOBAL enable_resource_group = true;。

创建资源组和分类器

创建资源组,关联分类器,并分配资源。

CREATE RESOURCE GROUP group_name 
TO (user='string', role='string', query_type in ('select'), source_ip='cidr'
) -- 创建分类器,多个分类器间用英文逗号(,)分隔。
WITH ("cpu_core_limit" = "INT","mem_limit" = "m%","concurrency_limit" = "INT","type" = "str" -- 资源组的类型,取值为 normal 或 short_query。
);

示例:

CREATE RESOURCE GROUP rg1
TO (user='rg1_user1', role='rg1_role1', query_type in ('select'), source_ip='192.168.x.x/24'),(user='rg1_user2', query_type in ('select'), source_ip='192.168.x.x/24'),(user='rg1_user3', source_ip='192.168.x.x/24'),(user='rg1_user4'),(db='db1')
WITH ('cpu_core_limit' = '10','mem_limit' = '20%','big_query_cpu_second_limit' = '100','big_query_scan_rows_limit' = '100000','big_query_mem_limit' = '1073741824'
);

查看资源组和分类器

查询所有的资源组和分类器

SHOW RESOURCE GROUPS ALL;

查询和当前用户匹配的资源组和分类器

SHOW RESOURCE GROUPS;

查询指定的资源组和分类器

SHOW RESOURCE GROUP group_name;

实操记录

'root'@(none) 06:05:20>SHOW RESOURCE GROUPS;
+------+-----------+----------------+-----------+----------------------------+---------------------------+---------------------+-------------------+--------+-----------------------------------------------+
| name | id        | cpu_core_limit | mem_limit | big_query_cpu_second_limit | big_query_scan_rows_limit | big_query_mem_limit | concurrency_limit | type   | classifiers                                   |
+------+-----------+----------------+-----------+----------------------------+---------------------------+---------------------+-------------------+--------+-----------------------------------------------+
| rg2  | 129398467 | 10             | 12.0%     | 300                        | 50000000                  | 536870912           | 2000000           | NORMAL | (id=129398469, weight=10.0, db='test') |
| rg1  | 129398471 | 10             | 15.0%     | 300                        | 50000000                  | 8589934592          | 2000000           | NORMAL | (id=129398473, weight=10.0, db='test') |
+------+-----------+----------------+-----------+----------------------------+---------------------------+---------------------+-------------------+--------+-----------------------------------------------+
2 rows in set (0.00 sec)'root'@(none) 06:05:43>SHOW RESOURCE GROUPS ALL;
+------+-----------+----------------+-----------+----------------------------+---------------------------+---------------------+-------------------+--------+----------------------------------------------------------------------------------------------------+
| name | id        | cpu_core_limit | mem_limit | big_query_cpu_second_limit | big_query_scan_rows_limit | big_query_mem_limit | concurrency_limit | type   | classifiers                                                                                        |
+------+-----------+----------------+-----------+----------------------------+---------------------------+---------------------+-------------------+--------+----------------------------------------------------------------------------------------------------+
| rg1  | 129398471 | 10             | 15.0%     | 300                        | 50000000                  | 8589934592          | 2000000           | NORMAL | (id=129398472, weight=3.459375, user=test_rw, query_type in (SELECT), source_ip=192.168.10.12/24)   |
| rg1  | 129398471 | 10             | 15.0%     | 300                        | 50000000                  | 8589934592          | 2000000           | NORMAL | (id=129398473, weight=10.0, db='test')                                                      |
| rg2  | 129398467 | 10             | 12.0%     | 300                        | 50000000                  | 536870912           | 2000000           | NORMAL | (id=129398468, weight=3.459375, user=bigdatat_rw, query_type in (SELECT), source_ip=192.168.10.13/24) |
| rg2  | 129398467 | 10             | 12.0%     | 300                        | 50000000                  | 536870912           | 2000000           | NORMAL | (id=129398469, weight=10.0, db='test')                                                      |
+------+-----------+----------------+-----------+----------------------------+---------------------------+---------------------+-------------------+--------+----------------------------------------------------------------------------------------------------+
4 rows in set (0.00 sec)'root'@(none) 06:06:18>SHOW RESOURCE GROUP rg1;
+------+-----------+----------------+-----------+----------------------------+---------------------------+---------------------+-------------------+--------+--------------------------------------------------------------------------------------------------+
| name | id        | cpu_core_limit | mem_limit | big_query_cpu_second_limit | big_query_scan_rows_limit | big_query_mem_limit | concurrency_limit | type   | classifiers                                                                                      |
+------+-----------+----------------+-----------+----------------------------+---------------------------+---------------------+-------------------+--------+--------------------------------------------------------------------------------------------------+
| rg1  | 129398471 | 10             | 15.0%     | 300                        | 50000000                  | 8589934592          | 2000000           | NORMAL | (id=129398472, weight=3.459375, user=test_rw, query_type in (SELECT), source_ip=192.168.10.12/24) |
| rg1  | 129398471 | 10             | 15.0%     | 300                        | 50000000                  | 8589934592          | 2000000           | NORMAL | (id=129398473, weight=10.0, db='test')                                                    |
+------+-----------+----------------+-----------+----------------------------+---------------------------+---------------------+-------------------+--------+--------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)'root'@(none) 06:06:24>

说明:weight:代表分类器的匹配度。

管理资源组配额和分类器

您可以修改资源组的配额,以及增加或删除资源组的分类器。
为已有的资源组修改资源配额。

ALTER RESOURCE GROUP group_name WITH ('cpu_core_limit' = 'INT','mem_limit' = 'm%'
);

删除指定资源组。

DROP RESOURCE GROUP <group_name>;

添加新的分类器。

ALTER RESOURCE GROUP <group_name> ADD (user='string', role='string', query_type in ('select'), source_ip='cidr');

删除指定的分类器。

ALTER RESOURCE GROUP <group_name> DROP (CLASSIFIER_ID_1, CLASSIFIER_ID_2, ...);

删除所有的分类器。

ALTER RESOURCE GROUP <group_name> DROP ALL;

监控资源组

可监控的资源组相关 Metric 包括:

  • FE 节点

    • starrocks_fe_query_resource_group:该资源组中查询任务的数量。
    • starrocks_fe_query_resource_group_latency:该资源组的查询延迟百分位数。
    • starrocks_fe_query_resource_group_err:该资源组中报错的查询任务的数量。
    • 查看metrics采集数据:FE IP:8040/metrics
    • image.png
  • BE 节点

    • starrocks_be_resource_group_cpu_limit_ratio:该资源组 CPU 配额比率的瞬时值。
    • starrocks_be_resource_group_cpu_use_ratio:该资源组 CPU 使用率瞬时值。
    • starrocks_be_resource_group_mem_limit_bytes:该资源组内存配额比率的瞬时值。
    • starrocks_be_resource_group_mem_allocated_bytes:该资源组内存使用率瞬时值。
    • 查看metrics采集数据:BE IP:8040/metrics
    • image.png

总结:

以上是starrocks集群资源资源的介绍,欢迎评论交流,转发,收藏~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/655653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache Paimon基础记录

基本都是在官网的学习&#xff0c;简单记录一下其中的核心特点 Apache Paimon 官网 Apache Paimon | Apache Paimon 根据官网介绍去快速了解 paimon 是用来设计做什么&#xff0c;可以做什么&#xff0c;对比与其他数据湖有什么特点&#xff0c;如何使用 Paimon 特点 前身…

酒鬼酒2024年展望:稳发展动能,迈入恢复性增长轨道

文 | 琥珀酒研社 作者 | 渡过 最近几个月来&#xff0c;白酒估值回落到近十年来低位&#xff0c;反映出了整个白酒行业的市场低迷和虚弱现状。不管是头部企业五粮液、泸州老窖&#xff0c;还是区域酒企口子窖、金种子酒等&#xff0c;最近都通过“回购”或“增持”&#xff0…

【C语言】【力扣】刷题小白的疑问

一、力扣做题时的答案&#xff0c;没有完整的框架 疑问&#xff1a; 在学习C语言的初始&#xff0c;就知道C语言程序离不开下面这个框架&#xff0c;为什么力扣题的解答往往没有这个框架&#xff1f; #include <stdio.h>int main() {return 0; } 解答&#xff1a; 力扣平…

常用直线检测算法

概述 在计算机视觉领域&#xff0c;我们经常需要做一些特殊的任务&#xff0c;而这些任务中经常会用到直线检测算法&#xff0c;比如车道线检测、长度测量等。– 资料 直线检测算法汇总_技术挖掘者的博客-CSDN博客_直线检测算法 直线检测算法博文中缺失的几个源码(Hough_lin…

联想乐商店更新安卓APK错误处理

当你点击“重新提交”&#xff0c;联想开放平台会卡死 其实他们的网页是有BUG的。HTTP GET appDetail请求会有个服务器内部错误 联系了联想客服&#xff0c;他们的绕过去方案是&#xff0c;你要选择“已上架” 然后再更新版本就可以了

手把手带你死磕ORBSLAM3源代码(六十三) LocalMapping.cc LocalMapping

目录 一.前言 二.代码 2.1 完整代码 一.前言 LocalMapping类主要负责处理局部地图的构建和优化。它接收来自相机的图像数据,提取特征点,并与先前帧的特征点进行匹配,以估计相机的运动并更新地图。 以下是关于代码的一些详细说明: LocalMapping的构造函数(LocalMappin…

Alzet 代理商,你知道是什么吗?

代理商、供应商傻傻分不清楚。在购买产品时或者在搜索商品时&#xff0c;有些产品会出现代理商、供应商的字样。你知道它们的区别么&#xff1f; 下面&#xff0c;我们就简单了解下Alzet 供应商与Alzet 代理商分别是什么&#xff1f;以及Alzet 渗透泵的产品概况吧。 Alzet 供…

【Python机器学习系列】建立XGBoost模型预测心脏疾病(完整实现过程)

一、引言 前文回顾&#xff1a; 一文彻底搞懂机器学习中的归一化与反归一化问题 【Python机器学习系列】一文彻底搞懂机器学习中表格数据的输入形式&#xff08;理论源码&#xff09; 【Python机器学习系列】一文带你了解机器学习中的Pipeline管道机制&#xff08;理论源码…

【Python】03快速上手爬虫案例三:搞定药师帮

文章目录 前言1、破解验证码2、获取数据 前言 提示&#xff1a;通过用户名、密码、搞定验证码&#xff0c;登录进药师帮网站&#xff0c;然后抓取想要的数据。 爬取数据&#xff0c;最终效果图&#xff1a; 1、破解验证码 使用药师帮测试系统&#xff1a;https://dianrc.ysb…

2024 高级前端面试题之 HTML 「精选篇」

该内容主要整理关于 HTML 的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 HTML模块精选篇 1. 如何理解HTML语义化2. H5的新特性有哪些3. 说一下 HTML5 Drag API4. iframe有那些缺点5. 如何实现浏览器内多个标签页之间的通信6. 简述一下s…

Elasticsearch:如何为 Elastic Stack 配置 AI Assistant

了解并安装 Elastic AI Assistant Elastic 推出了 Observability AI Assistant&#xff0c;这是一款利用生成式 AI 来增强你的 Observability 体验的强大工具。 该 AI 助手由 OpenAI 或 Azure OpenAI 服务的连接器提供支持&#xff0c;可带来上下文洞察和聊天功能&#xff0c;…

104.乐理基础-五线谱-中音谱号、次中音谱号

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;103.乐理基础-五线谱-低音谱号-CSDN博客 上一个内容练习答案&#xff1a; 常用的谱号就是下图所示的四个&#xff0c;其中高音谱号与低音谱号已经在上一个内容和上上一个内容中写过了&#xff0c;音乐中百分之九十…

html css实现钟表简单移动

文章目录 一、实现钟表简单移动二、HTML三、CSS四、热门文章 一、实现钟表简单移动 下面是一个使用HTML和CSS实现简单移动的钟表的示例代码&#xff1a; <!DOCTYPE html> <html><head><style>.clock {width: 200px;height: 200px;border-radius: 50%…

微服务架构实施攻略:如何选择合适的微服务安全保障策略?

随着业务的快速发展和系统的日益复杂&#xff0c;传统的单体应用逐渐显露出瓶颈&#xff0c;已无法满足现代软件研发的需求。微服务架构作为一种灵活、可扩展的解决方案&#xff0c;通过将复杂系统拆分为一系列小型服务来提高系统的可伸缩性、灵活性和可维护性。在实施微服务架…

【C++历练之路】探秘C++三大利器之一——多态

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#x1f354;: 在计算机科学的广袤领域中&#xff0c;C多态性是一门令人着迷的技术艺术&#xff0c;它赋予我们的代码更强大的灵活性和可维护性。想象一下&#xff0c;你正在构建一个程序&#xff0c;需要适应不断…

python3.8 安装缺少ssl、_ctypes模块解决办法

问题 安装pyhton3.8安装默认不依赖ssl 运行Flask项目时报错&#xff1a; Traceback (most recent call last):File "/usr/local/python3/bin/flask", line 8, in <module>sys.exit(main())File "/usr/local/python3/lib/python3.8/site-packages/flask…

电脑文件丢失怎么恢复数据?数据恢复,3个方法!

“我有一份很重要的资料文件保存在电脑上了&#xff0c;但是刚刚发现这些文件莫名其妙丢失了。电脑文件丢失应该怎么恢复数据呀&#xff1f;大家有什么比较好用的方法可以推荐吗&#xff1f;” 在日常生活中&#xff0c;我们经常都需要使用电脑&#xff0c;当然&#xff0c;也会…

虹科干货 | 如何使用nProbe Cento构建100 Gbit NetFlow 传感器

本文是一份全面的指南&#xff0c;解释了如何使用nProbe Cento构建一个高效的100 Gbit NetFlow传感器。旨在帮助大家充分利用NetFlow技术&#xff0c;以监控和分析高速网络流量。 当需要监控分布式网络&#xff0c;了解流经上行链路或关键网段的网络流量时&#xff0c;NetFlow…

TensorFlow2实战-系列教程 总目录

TensorFlow 深度学习 开发环境搭建 全教程 TensorFlow2实战-系列教程 总目录 TensorFlow2实战-系列教程1&#xff1a;回归问题预测TensorFlow2实战-系列教程2&#xff1a;神经网络分类任务TensorFlow2实战-系列教程3&#xff1a;猫狗识别1TensorFlow2实战-系列教程4&#xff1…

Linux系列之查看cpu、内存、磁盘使用情况

查看磁盘空间 df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间&#xff0c;目前还剩下多少空间等信息。使用df -h命令&#xff0c;加个-h参数是为了显示GB MB KB单位&#xff0c;这样更容易查看 Filesystem …