日志服务 SQL 引擎全新升级

news2025/1/9 2:02:57

作者:戴志勇、顾汉杰(执少)

SQL 作为 SLS 基础功能,每天承载了用户大量日志数据的分析请求,既有小数据量的快速查询(如告警、即席查询等);也有上万亿数据规模的报表级分析。SLS 作为 Serverless 服务,除了要满足不同用户的各类需求,还要兼顾性能、隔离性、稳定性等要求。过去一年多的时间,SLS SQL 团队做了大量的工作,对 SQL 引擎进行了全新升级,SQL 的执行性能、隔离性等方面都有了大幅的提升。

SQL 引擎重磅升级

  • 计算引擎切换为 C++ 版本,充分利用 CPU 的 SIMD 指令集加速能力。
  • 计算存储融合,将计算和存储(只读)并入一个进程,减少数据转换和拷贝开销。
  • Pipeline 计算模型支持细粒度并行,充分释放单机多核 CPU 的计算能力。
  • 调度模型升级,使任务调度更均衡和稳定,减少数据倾斜,并充分利用历史亲和力和多级缓存。
  • 更优的分布式执行计划,优化了多 count distinct、高基数聚合等场景。
  • 增量计算,对于相同的 SQL,复用历史局部查询结果,只计算最新的数据。
  • 数据缓存,引入阿里自研的缓存组件,自适应缓存列存数据,减少直接 IO 开销。
  • 高频函数性能升级,包括 ip 函数、json 函数等,性能有数倍甚至数十倍的提升。
  • 支持 logstore 的跨 project、跨 region 的查询和分析,更多细节参考 StoreView [1]

升级后的架构如下,QueryClinet 作为查询代理,负责请求接入、负载均衡、结果缓存等;Coordinator 负责整体 SQL 的并发控制和计划调度;整体采用计算存储分离的架构,同时对于只读 Worker,计算和存储融合部署在同一进程,尽可能减少数据转换和拷贝开销;升级后的 SQL 引擎,计算性能相比于之前有 3 倍左右的提升。

整体提升效果

下图是线上某大集群升级后,SQL 整体延时的变化情况,平均延时下降了 50%,整体性能提升了一倍左右,同时查询毛刺大幅减少。

典型场景提升效果

下面给出一些典型分析场景的具体示例,来看看 SQL 引擎升级之后的表现情况。

1. 千亿规模单列聚合秒级完成,万亿规模仅需 10s

对 1000 亿规模数据进行单列聚合统计,执行耗时在 1.46s。

对万亿规模数据,开启增强 SQL 模式,单列聚合只需 15s。

更进一步,通过设置合适的计算并行度,万亿规模数据单列聚合可以 10s 内完成。

2. 中间结果复用,支持增量计算

先查一段时间的数据,1.5 秒左右完成。

相同的查询条件,查询时间范围扩大 10 分钟,400 毫秒完成。

3. json 函数性能大幅提升

新引擎优化了 json 函数的实现,和旧引擎相比,平均有数倍的提升。

以 json_extract_scalar 处理函数为例,对 1.7 亿条包含 json 字段的日志数据进行计算分析。

使用老引擎,耗时 34.9 秒,结果不精确。

使用新引擎,耗时 5.8 秒完成,且结果精确,json 处理性能提升了 6 倍以上。

4. ip 函数性能 10 倍以上提升

4.1 子网网段计算 is_subnet_of(纯内存计算)

对 10 亿行包含 ClientIp 字段的日志数据进行子网网段计算分析,使用老引擎,耗时 20s。

使用新引擎,耗时 1s 内完成,性能提升 20 倍左右。

4.2 依赖 IP 数据库查询

对 87 亿行包含 ClientIp 字段的日志数据进行 IP 计算分析,使用老引擎,耗时 24s。

使用新引擎,耗时 2s 完成,性能提升 12 倍左右。

5. 千万级高基数聚合 2s 内完成

计算引擎专门针对高基数聚合场景进行了特定优化,分别对数值型和字符型两种高基数聚合场景进行测试。

5.1 数值型高基数聚合

测试 200 亿规模数据,其中有 768w 个 distinct 值。

5.2 字符型高基数聚合

测试 20 亿规模数据,有 20 亿个 distinct 值(实际每一个 RequestId 都不一样,平均长度 24 个字符。)

通过设置合适的并行度,延时进一步减少到 6.2s。

同时需注意:并行度并非越大越好,越大调度开销越高。因此可以看到,随并行度提升,性能逐渐收敛。有时,也可能出现负优化。

6. 多列聚合性能提升

测试 1000 亿规模数据,同时对两列进行 group by 聚合分析,一列是数值型,一列是字符型。

使用老引擎,耗时 27.5 秒,结果不精确。

使用新引擎,耗时 6.5 秒,性能提升 4 倍左右,且结果精确。

7. 多表 join 性能提升

使用 compare 函数计算同比。

使用老引擎,耗时 3 秒。

使用新引擎执行,耗时 560 毫秒,性能提升 5 倍左右。

备注:所有测试均在线上环境进行,使用模拟数据,数值列为随机值,字符列为长度 24-30 之间的随机字符,上述测试指标与测试数据、shard 数量、集群节点规模均有一定关系,以实测数据为准。

典型案例:以游戏运营分析为例

引擎升级之后,SLS 具备基于日志数据的快速运营分析能力,无需建仓、无需额外组件(如消息、流处理、数仓等)投入,一站式的日志采集、存储、加工,可见即可得的查询、监控告警、运营分析,为业务带来了前所未有的轻松体验,特别适合以数据为驱动的业务场景快速落地。

下面,我们将以游戏运营分析场景为例,给大家分享一些使用实践。

1. 基于 SQL 设置业务监控告警

游戏场景中,单个区服一般有人数上限的限制,当某款游戏上线人数突然暴增,我们可以设置监控告警,以快速发现高压区服「大量注册用户涌入」,并及时进行扩容或引流等业务运营处理。

event:register | select 
  __time__ - __time__ % 60 as time,
  serverId as "区服Id",
  count(*) as "注册数"
group by time,serverId
having "注册数" > 5000
order by "注册数" desc

2. 使用 compare 函数实现 PV/UV 同环比监控

一款游戏的发行或发版,通常会持续观测用户数以及访问情况,以及时评估游戏和版本质量并进行调整。

通过 SLS 内置的 compare 函数(内部转化成 join 统计分析)可以轻松获取用户 PV/UV 同环比数据分析。

基于 SQL 实现 PV/UV 环比:

* | select diff[1] as today, round((diff[3]-1.0)*100, 2) as growth 
from (
  select compare(pv, 86400) as diff 
  from (select count(distinct remote_addr) as pv from log)
)

基于 SQL 实现 PV/UV 同比(同比字段为 t,同比时需保证值相同,如 08:40):

* | select t, diff[1] as today, diff[2] as yestoday, diff[3] as percentage 
from (
  select t, compare(pv, 86400) as diff 
  from (
    select count(1) as pv, date_format(from_unixtime(__time__), '%H:%i') as t 
    from log group by t
  ) 
  group by t order by t
)

3. 基于 SQL 搭建看板/大盘/报表

更进一步,我们可以基于 SQL 和仪表盘功能制作每日业务大盘、运营分析看板或者业务报表等。在现有 SQL 能力基础上,这样的报表分析和运营数据随着游戏业务的快速落地,所见即所得。

4. 和 MySQL 外表(在线业务数据)做联邦查询,实现业务运营分析

一般来说,一些业务数据和用户信息,通常是在 MySQL 这样的常用在线数据库中,运营分析时常常会结合游戏用户的日志数据和在线业务数据进行联合分析,SLS 支持 MySQL/OSS 等多源外表联邦查询,只需要配置一个外表数据源,即可在 SQL 中进行多表 Join 联邦分析。

有了外表支持,比如想要分析不同性别的活跃用户分布,通过以下 SQL 即可实现:

-- sls_join_meta_store是一个外表(MySQL或OSS)
* | 
select 
  case gender when 1 then '男性' else '女性' end as gender, 
  count(1) as pv 
from log l join sls_join_meta_store u on l.userid = u.uid 
group by gender 
order by pv desc

更多特性,敬请期待

在全新 SQL 引擎升级基础之上,我们接下来还将陆续推出更进一步的特性支持。

1)过滤下推

计算存储融合后,我们将复杂的过滤条件(比如 like、正则匹配等)下推至存储层。采用两阶段执行,首先读取有过滤条件的列,执行表达式计算,过滤出有效行,然后再去读取满足条件的其他列,可以大幅避免无效 IO。

2)完全精确

建设了更完善的隔离和流控体系,进一步提升了 Qos 保障,通过隔离的资源池为用户提供“完全精确”模式,确保能够读取用户指定时间范围内的全量数据,实现 SQL 分析完全精确。

相关链接:

[1] StoreView

https://help.aliyun.com/zh/sls/user-guide/dataset-storeview-overview

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

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

相关文章

20250107在WIN10下使用无线ADB连接Andorid7.1.2

connected to 192.168.3.217:5555 adb shell 20250107在WIN10下使用无线ADB连接Andorid7.1.2 2025/1/7 18:12 缘起:公司买了一台6000-7000¥的地面站【Andorid7.1.2】,需要通过ifconfig命令来获取其中的网络信息。 虽然系统是VERY非常的陈旧&a…

浙江省自然资源厅:基于“浙里办”的自然资源移动政务服务创新实践——“浙里自然资源”

摘 要:本文基于浙江省自然资源移动政务服务的创新实践,设计和实现“浙里自然资源”应用,依托浙江省省域空间治理数字化平台特有的架构基础,在提升功能性和可用性、加强运营力度、丰富服务内容等方面采取了管理举措和技术创新。通…

使用 Jupyter Notebook:安装与应用指南

文章目录 安装 Jupyter Notebook1. 准备环境2. 安装 Jupyter Notebook3. 启动 Jupyter Notebook4. 选择安装方式(可选) 二、Jupyter Notebook 的基本功能1. 单元格的类型与运行2. 可视化支持3. 内置魔法命令 三、Jupyter Notebook 的实际应用场景1. 数据…

NeurIPS 2024 | 像素级LLM实现图像视频理解、生成、分割和编辑大统一(昆仑万维等)

Accepted by NeurIPS 2024 文章链接:https://arxiv.org/pdf/2412.19806 项目链接:https://vitron-llm.github.io/ Github链接:https://github.com/SkyworkAI/Vitron 亮点直击 首次提出了一种通用的视觉多模态大语言模型(MLLM&…

嵌入式技术之Linux(Ubuntu) 一

一、Linux入门 1.硬件和操作系统以及用户的关系 一个传感器,获得数据后,需要向服务器发送数据。传感器传数据给上位机。 上位机需要一个程序来接收数据,那么这个上位机是什么机器? 我们的笔记本电脑就可以当成上位机。 两个手…

用户界面软件02

基于表单的用户界面 在“基于表单的用户界面”里面,用户开始时选中某个业务处理(模块),然后应用程序就使用一系列的表单来引导用户完成整个处理过程。大型机系统上的大部分用户界面都是这样子的。[Cok97]中有更为详细的讨论。 面…

YOLOv8/YOLOv11改进 添加CBAM、GAM、SimAM、EMA、CAA、ECA、CA等多种注意力机制

目录 前言 CBAM GAM SimAM EMA CAA ECA CA 添加方法 YAML文件添加 使用改进训练 前言 本篇文章将为大家介绍Ultralytics/YOLOv8/YOLOv11中常用注意力机制的添加,可以满足一些简单的涨点需求。本文仅写方法,原理不多讲解,需要可跳…

【express-generator】05-路由中间件和错误处理(第一阶段收尾)

一、前言 上篇文章我们介绍了express-generator的请求体解析,重点讲了常用的请求体数据格式(JSON/URL 编码的表单数据)以及一个FILE文件上传,同时搭配代码示范进行辅助理解。 二、本篇重点 我们继续第一阶段的知识,…

python无需验证码免登录12306抢票 --selenium(2)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 [TOC](python无需验证码免登录12306抢票 --selenium(2)) 前言 提示:这里可以添加本文要记录的大概内容: 就在刚刚我抢的票:2025年1月8日…

深度学习驱动的蛋白质设计技术与实践

通过设计特定的蛋白质结构,可以实现预期的生物功能,如催化特定化学反应、识别和结合特定分子、调控生物信号传导等,为生物医学、药物研发、生物技术等领域提供重要工具和解决方案。传统的蛋白质设计方法主要依赖于已知蛋白质结构的同源建模、…

【动态重建】时间高斯分层的长体积视频

标题:Representing Long Volumetric Video with Temporal Gaussian Hierarchy 来源:浙江大学 链接:https://zju3dv.github.io/longvolcap/ 文章目录 摘要一、前言二、主要方法2.1 时间高斯分层2.2 高效渲染2.3 层次结构更新2.4 紧凑的外观模型…

【STM32+CubeMX】 新建一个工程(STM32F407)

相关文章: 【HAL库】 STM32CubeMX 教程 1 --- 下载、安装 目录 第一部分、新建工程 第二部分、工程文件解释 第三部分、编译验证工程 友情约定:本系列的前五篇,为了方便新手玩家熟悉CubeMX、Keil的使用,会详细地截图每一步Cu…

el-date-picker 不响应change事件的解决办法

前言 接到需要把element plus组件的日期时间选择器的input输入框展示隐藏,遇到点击确认按钮change事件不被触发问题,解决办法如下: ①visible-change的回调参考 即根据visible-change的方法里的回调参数进行需要操作 const visibleChange …

api开发如何在代码中使用京东商品详情接口的参数?

选择编程语言和相关工具 以 Python 为例,你可以使用requests库来发送 HTTP 请求获取接口数据。如果是 Java,可以使用OkHttp等库。 Python 示例 假设你已经安装了requests库,以下是一个简单的代码示例来获取和使用京东商品详情接口参数&#…

【docker系列】可视化Docker 管理工具——Portainer

1. 介绍 Portainer是一个可视化的Docker操作界面,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录…

机器学习基础-大语言模型

目录 大语言模型的基本概念 “大”体现在什么地方? 预训练微调两阶段的基本流程和作用 第一阶段:利用语言模型进行无监督预训练 第二阶段:通过监督微调的模式解决下游任务 BERT模型中MLM和NSP机制基本概念 MLM NSP Prompt学习的基本概…

Ubuntu挂载Windows 磁盘,双系统

首先我们需要在终端输入这个命令,来查看磁盘分配情况 lsblk -f 找到需要挂载的磁盘,检查其类型( 我的/dev/nvme2n1p1类型是ntfs,名字叫3500winData) 然后新建一个挂载磁盘的目录,我的是/media/zeqi/3500wi…

Java设计模式 —— 【行为型模式】命令模式(Command Pattern) 详解

文章目录 模式介绍优缺点适用场景结构案例实现注意事项 模式介绍 有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么。此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此…

如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?Java .class文件编码和JVM运行期内存编码?

如何很快将文件转换成另外一种编码格式? 利用VS Code右下角的"选择编码"功能,选择"通过编码保存"可以很方便将文件转换成另外一种编码格式。尤其,在测试w/ BOM或w/o BOM, 或者ANSI编码和UTF编码转换,特别方便。VS文件另…

AnaConda下载PyTorch慢的解决办法

使用Conda下载比较慢,改为pip下载 复制下载链接到迅雷下载 激活虚拟环境,安装whl,即可安装成功 pip install D:\openai.wiki\ChatGLM2-6B\torch-2.4.1cu121-cp38-cp38-win_amd64.whl