高基数 GroupBy 在 SLS SQL 中的查询加速

news2024/11/14 14:54:50

作者:顾汉杰(执少)

什么是高基数 GroupBy

简单来说,想要分析的数据,拥有超多的“唯一值计数”(Distinct Count),而我们需要对这些数据进行分组分析(如统计次数、排名、计算均值、分位值等)。

高基数聚合计算在很多运营分析场景中都是刚需,它涉及对值不一样的海量数据进行分组聚合计算,以洞察用户行为、游戏玩家路径、市场趋势或产品表现等运营分析的关键指标。例如,在电商平台上,分析一段时间内不同商品类别在各个地区的销量分布,或者在游戏运营分析场景中,追踪玩家在游戏中的独特操作行为和路径,这些都需要处理基数极高的数据(如 ItemId、RequestId、TraceId 等,动辄上千万甚至亿级别的基数)。

现在的问题是,用户在进行此类分析时,由于数据量和复杂度的不同,SQL 执行耗时往往可能从数秒到数分钟甚至数小时不等,“高基数 GroupBy 执行太慢”,几乎成为用户的普遍认知,也是众多数据库和 OLAP 引擎重点关注的对象。SLS SQL 也持续关注这一点,并对此进行了相应的性能优化,本文即旨在向用户介绍 SLS 中的实现原理、查询加速手段以及适用场景。

GroupBy 的实现原理

GroupBy 是几乎所有 OLAP 引擎必备的基础聚合能力,分布式计算引擎一般将海量数据以 Hash 散列的方式分布到不同节点进行分组(分桶)计算,每个分组内对数据进行聚合,然后再基于堆(往往使用 PriorityQueue)进行排序或 Limit,最终输出给用户需要的数据,比如 TopN 排行结果等。

这个过程中,我们可能还会用到预聚合技术:利用数据的局部性原理,对原始数据进行预聚合(PartialAgg),然后再发往最终聚合节点(FinalAgg),以减少网络间数据传输开销。

所以,总体来说,GroupBy 聚合计算大致会经历以下四个过程:DataSource -> PartialAgg -> FinalAgg -> Output。

其中,DataSource 和 PartialAgg 一般是绑定在一起执行,而 FinalAgg 以及 Output 则由分布式网络中的另外一些节点执行。

体验 SLS 高基数 GroupBy 查询加速

有了上面的基础知识和了解后,我们开门见山,直接带大家来感受一下 SLS 中的上亿级别高基数 GroupBy 的查询加速体验。

为了更客观地评估和分析下面的性能变化,我们必须先讲清楚我们的测试数据和测试用例情况。

测试数据

我们采用了模拟的类似 Nginx 服务访问日志,保存在一个 Project/Logstore 中,SQL独享版 CU 数设置为 5000。测试数据 Schema 如下:

{  RequestId: varchar, /*测试数据会确保每个请求ID确保全局唯一*/  ClientIP: varchar,  Method: varchar,  Latency: int,  Status: int,  ...}

测试用例

我们准备了 3 种测试用例,分别对应 3 种不同的业务分析场景:

  1. 高基单列聚合:对 28 亿条请求日志,按 RequestId 字段进行 GroupBy 统计计数(实际基数为 28 亿)
  2. 高基多列聚合:对 45 亿条请求日志,按 ClientIp、Status、Latency 字段进行 3 列 GroupBy 统计计数(实际基数为 15 亿)
  3. 低基数值聚合:对 1.5 万亿条请求日志,按 Latency 字段统计 Top100 的频次(实际基数为 735 万)

测试说明

  1. 由于我们系统中设计有多级缓存,为了避免缓存对于测试的影响干扰,我们会在每次查询时通过添加 not <不存在的keyword> 过滤条件来避开缓存,以确保每次查询都进行完整的物理执行,公平地对比整体执行性能。
  2. 测试过程使用的是真实线上服务(地域为上海),测试数据真实存储在 SLS Logstore 中,但因分片数以及数据分布特征不尽相同,因此不同用户的数据实测结果可能略有差异,但相同量级应该大同小异。

🚗 走,上车!

案例 1:

高基单列聚合,对 28 亿条请求日志,按 RequestId 字段进行 GroupBy 统计计数(实际基数为 28 亿)

第一步,进行基准测试,使用普通 SQL 模式,查询大约需要 17s。

第二步,切换到增强 SQL 模式,并设置 session 参数 set session hash_partition_count=40(此值默认最大为 20),查询降到 10s。

这是什么魔法操作?

上文提到底层并行度已经足够分散,但我们面对的是一个 28 亿条绝对高基的测试数据集(每一个 RequestId 都不一样),即使底层并行度足够,FinalAgg 阶段仍将面临极大的聚合计算压力,而我们默认 FinalAgg 阶段的并行度与 shard 分片数相关但最大为 20,这里我们将这个能力开放给用户结合自身情况可以进行动态调整。

第三步,设置 session 参数 set session hash_partition_count=64/128/200,查询进一步降到 7s/4.5s/3.7s。

加速效果还不错。。。

通过增加 FinalAgg 阶段的并行度,我们看到查询从原来的 17s 降低到了 3.7s!同时,我们也看到并行度的增加对于查询延时的加速效果也逐渐收敛,这是因为在增加并行度的同时,也增加了额外的网络通信和调度开销。所以我们为该 session 参数设置了系统上限为 200,再往上其实可能也不会带来太大的加速收益。

以为这样就收工了,并没有!

第四步,设置 session 参数 set session high_cardinality_agg=true,查询降到 2.1s!

这又是发生了什么?

针对高基数场景的数据特征,我们将数据在底层走了一个不同的流转模式进行数据聚合,大幅提高效率。我们同样开放了相应的 session 参数供用户按需使用。

最终,高基单列聚合,我们将查询从原来的 17s 降至 2s,体验到了 8 倍的加速快感。

案例 2:

高基多列聚合,对 45 亿条请求日志,进行多列 GroupBy 统计计数(实际多列组合维基为 15 亿)

第一步,进行基准测试,使用普通 SQL 模式,查询大约需要 24s。

第二步,切换到增强 SQL 模式,并设置 session 参数 set session hash_partition_count=40(此值默认最大为 20),查询降 到11s。

第三步,提升并行度 set session hash_partition_count=64/128/200,查询进一步降到 7.3s/5.9s/5.8s。

第四步,设置 session 参数 set session high_cardinality_agg=true,查询降到 2.9s!

最终,高基多列聚合,我们将查询从原来的 24s 降至 3s,同样也体验到了 8 倍的加速快感。

案例 3:

低基数值聚合,对 1.5 万亿条请求日志,按 Latency 字段统计 Top100 的频次(实际基数为 735 万)

第一步,进行基准测试,使用普通 SQL 模式,查询虽然只有 4.3s,但是因数据量大小限制被截断而结果不精确。

第二步,切换到增强 SQL 模式,查询只需 23.4s 即可精确查询,此时增强 SQL 体现出在面对超大规模数据量时的威力。

第三步,设置 session 参数 set session hash_partition_count=40/64/128/200(此值默认最大为 20),查询延时维持到 22-23s 之间,可以看到,在低基聚合场景中,通过提升 FinalAgg 并行度来加速查询,效果十分有限。

通过系统的监控分析,可以发现此时计算压力主要在 PartialAgg,FinalAgg 并不存在计算瓶颈,因此对它的提升,并不会对整体查询有明显的加速效果。

第四步,让我们再试试高基优化参数 set session high_cardinality_agg=true,结果是执行超时。

这说明,高基优化参数并不适用于低基聚合场景,在低基维度下,面对超大规模数据(测试数据超过 1.5 万亿)的聚合计算,默认的预聚合技术(PartialAgg+FinalAgg)能够有效发挥计算效能,仍然是不二之选。

结论和建议

本文主要介绍了 SLS 中的高基数 GroupBy 查询加速原理,并设计了 3 种典型场景的测试用例,通过 SLS 线上服务的实际测试表现,带大家体验了高基聚合计算 8 倍查询加速、万亿数据 20s 查询的极致快感。

在测试过程中,也一一向读者解释了其中的具体细节和原理,为什么会这样?为什么能加速?为什么加速不明显等等。以下是给 SLS 用户关于此方面的查询实践和建议:

  1. 数据规模不大时,使用默认模式即可;
  2. 数据规模很大而数据分片不多时,建议开启增强 SQL 模式,可以极大提升数据底层并行度;
  3. 高基聚合时,可以尝试以下两个 session 参数,可能带来数倍查询加速效果:
    • set session hash_partition_count= 设置多少合适?建议 20-64 以内,过犹不及
    • set session high_cardinality_agg=true/false 是否设置取决于数据离散度
  4. 低基聚合,以上两个 session 参数并不十分适用,通过默认增强 SQL 模式即可实现查询加速和精确。

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

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

相关文章

如何高效调试JavaScript代码:从Console到断点调试

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介如何高效调试JavaScript代码&#xff1a;从Console到断点调试1. 引言2. 基本调试工具概览2.1 浏览器开发者工具&#xff08;DevTools&#xff09;如何打开浏览器开发者工具&#xff1f; 2.2 常用的调试面板 3. 基本调试方法3.1 使用…

Springboot邮箱发送:如何快速集成并发信?

Springboot邮箱发送性能如何&#xff1f;怎么用SpringBoot发信&#xff1f; Springboot作为一款流行的Java框架&#xff0c;提供了简便的方式来集成邮件发送功能。AokSend将详细介绍如何快速集成Springboot邮箱发送功能&#xff0c;并实现高效的邮件发送。 Springboot邮箱发送…

考拉悠然产品发布会丨以悠然远智全模态AI应用平台探索AI行业应用

9月6日&#xff0c;成都市大模型新技术新成果发布暨供需对接系列活动——考拉悠然专场&#xff0c;在成都市高新区菁蓉汇盛大举行。考拉悠然重磅发布了悠然远智丨全模态AI应用平台&#xff0c;并精彩展示了交通大模型应用——智析快处等最新的AI产品和技术成果。 在四川省科学…

警用车载4G5G无线视频监控技术方案

目录 一、背景 二、系统方案设计 1.1系统架构 1.2车载终端 1.3监控中心 1.4传输网络 三、警用车载监控功能特点 2.1警用车载监控功能 &#xff08;1&#xff09;实时视频监控 &#xff08;2&#xff09;录像存储回放 &#xff08;3&#xff09;车载报警联动 &#…

如何清理C盘临时文件,释放10G以上空间

在我们日常使用电脑系统的过程中&#xff0c;想必大家都曾遇到过这样的情况&#xff1a;明明没有主动安装任何软件&#xff0c;然而 C 盘的可用空间却逐渐减少&#xff0c;甚至有时会收到系统发出的空间不足的提醒。 其实&#xff0c;在系统中存在这样一个至关重要的临时文件夹…

【Prometheus】PromQL聚合函数详细用法与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

基于springboot+vue乒乓球预约管理系统

基于springbootvuemysql实现的乒乓球预约管理系统&#xff08;源码数据库部署视频&#xff09; ### 主要技术 SpringBoot、LayUI、Vue、MySQL ### 系统角色 用户、管理员 ### 系统功能 前台&#xff1a; 首页、乒乓球场、公告信息、留言反馈、个人中心 后台&#xff1a; …

Nginx解析:入门笔记

&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索nginx之旅✨ &#x1f44b; 大家好&#xff01;文本学习和探索Nginx配置。…

【C++ Primer Plus习题】13.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "classic.h&quo…

数据同步-Mysql同步到ElasticSearch

Mysql同步到ElasticSearch 数据同步1、定时任务2、双写3、MQ异步写入4、Logstash5、Canal 数据同步 一般情况下&#xff0c;如果做查询搜索功能&#xff0c;使用 ES 来模糊搜索&#xff0c;但是数据是存放在数据库 MySQL 里的&#xff0c;所以说我们需要把 MySQL 中的数据和 E…

身份证识别及信息核验 API 对接说明

身份证识别及信息核验 API 对接说明 本文将介绍一种 身份证识别及信息核验 API 对接说明&#xff0c;它可以通过输入身份证图片 或 姓名和身份证号码&#xff0c;来校验姓名和身份证号的真实性和一致性。本接口用于校验姓名和身份证号的真实性和一致性&#xff0c;您可以通过输…

SOMEIP_ETS_098: SD_ClientService_subscribe_without_method_call

测试目的&#xff1a; 验证当测试器激活DUT的ETS客户端服务模式并发送OfferService消息时&#xff0c;DUT不会尝试订阅每个接收到的OfferService&#xff0c;因为测试器没有发送必要的clientServiceSubscribeEventgroup消息。 描述 本测试用例旨在确保DUT在没有收到clientSe…

SuiNS的成就与未来愿景

是Sui上领先的域名服务&#xff0c;通过用用户友好、易记的域名替换复杂的钱包地址&#xff0c;提升了链上交互。在过去的两年中&#xff0c;SuiNS经过了多次改进和优化&#xff0c;致力于创建易于理解的链上身份。 借鉴社交媒体的常见用法&#xff0c;SuiNS更进一步&#xff…

这样的接口幂等实现我认为最为优雅(防重复提交)

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 这样的接口幂等实现我认为最为优雅 基于token(和网上大部分不一样)对比构思需要幂等性的场景不需…

【无人机设计与控制】用于四轴飞行器仿真和控制系统设计的参数驱动的 Simulink 模型

摘要 本文介绍了一种用于四轴飞行器仿真和控制系统设计的参数驱动Simulink模型。该模型通过参数化设置&#xff0c;允许用户对四轴飞行器的关键性能参数&#xff08;如质量、转动惯量、推力系数等&#xff09;进行调整&#xff0c;从而研究不同参数对飞行器性能的影响。通过此…

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用…

论文学习:常用的遥感参数

文章目录 归一化植被指数&#xff08;NDVI&#xff09;归一化红外指数7&#xff08;NDII7&#xff09;温度植被干旱指数&#xff08;TVDI&#xff09;归一化燃烧指数&#xff08;NBR&#xff09;差分归一化燃烧指数&#xff08;dNBR&#xff09;植被覆盖率&#xff08;VFC&…

2万字长文,如何成为一个“懂”AI 的产品经理?

产品经理比起大模型产品&#xff0c;更应该关注大模型本身。 注&#xff1a;随着时间推移&#xff0c;文章中的结论可能会发生变化。 此外&#xff0c;本文面向的读者是非算法团队的产品经理&#xff0c;为了保障文章的可读性&#xff0c;可能会省略部分细节&#xff0c;同时…

值得入手的 5 大数据恢复软件,数据恢复那是又快又全!

在日常工作与生活中&#xff0c;数据丢失的情况屡见不鲜。诸如重要文件的不慎误删、电脑系统的骤然崩溃、存储设备受病毒侵袭、格式化操作的失误等&#xff0c;此类突发状况常令人猝不及防。在此情形下&#xff0c;数据恢复软件便成为挽救重要数据的关键利器。 今天&#xff0c…

GMT绘图笔记:在地图上绘制直线而不是大圆弧

问题&#xff1a;利用GMT地图上绘制两点之间的直线&#xff0c;如果跨度过大会出现大圆弧线&#xff0c;而通常在备注地图图例的时候&#xff0c;通常需要强制绘制为直线。 在GMT&#xff08;Generic Mapping Tools&#xff09;中&#xff0c;使用plot命令绘制大跨度的范围线段…