日志服务 SQL 引擎全新升级

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

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.mzph.cn/pingmian/66531.shtml

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

相关文章

【微服务】5、服务保护 Sentinel

Sentinel学习内容概述 Sentinel简介与结构 Sentinel是Spring Cloud Alibaba的组件,由阿里巴巴开源,用于服务流量控制和保护。其内部核心库(客户端)包含限流、熔断等功能,微服务引入该库后只需配置规则。规则配置方式有…

matlab编写Newton插值多项式

定义: 即: clear x [1, 2, 3, 4]; % x坐标 y [2, 1, 4, 3]; % y坐标 % 定义目标插值点 xi 2.5;% x: 已知数据点的x坐标% y: 已知数据点的y坐标% xi: 插值点,可以是一个数或一个向量n length(x);% 初始化差商矩阵F zeros(n, n);F(:,1…

unity学习14:unity里的C#脚本的几个基本生命周期方法, 脚本次序order等

目录 1 初始的C# 脚本 1.1 初始的C# 脚本 1.2 创建时2个默认的方法 2 常用的几个生命周期方法 2.1 脚本的生命周期 2.1.1 其中FixedUpdate 方法 的时间间隔,是在这设置的 2.2 c#的基本语法别搞混 2.2.1 基本的语法 2.2.2 内置的方法名,要求更严…

东土科技参股广汽集团飞行汽车初创公司,为低空经济构建新型产业生态

近日,广汽集团旗下专注于飞行汽车领域的初创公司广东高域科技有限公司于2024年12月31日正式成立,在穿透后的股东信息中,东土科技通过广州瓴云科技投资合伙企业(有限合伙)赫然在列。 此前12月18日,广汽集团…

基于Elasticsearch8的向量检索实现相似图形搜索

Elasticsearch8版本增加了KNN向量检索,可以基于此功能实现以图搜图功能。 1、首先创建索引,es提供了类型为dense_vector的字段,用于存储向量,其中dims是向量维度,可以不配置,es会根据第一条插入的向量维度…

PHP如何删除数组中的特定值?

php 中删除数组特定值的方法有三种:unset():直接删除指定索引的值,但会保留数组索引结构和未删除元素,适合小数组。array_filter():根据自定义回调函数筛选数组元素,返回一个新数组,原数组不变&…

计算效率提升 10 倍,存储成本降低 60%,灵犀科技基于 Apache Doris 建设统一数据服务平台

导读:灵犀科技早期基于 Hadoop 构建大数据平台,在战略调整和需求的持续扩增下,数据处理效率、查询性能、资源成本问题随之出现。为此,引入 Apache Doris 替换了复杂技术栈,升级为集存储、加工、服务为一体的统一架构&a…

Netty中用了哪些设计模式?

大家好,我是锋哥。今天分享关于【Netty中用了哪些设计模式?】面试题。希望对大家有帮助; Netty中用了哪些设计模式? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Netty 是一个高性能的网络通信框架,广泛…

Linux操作系统——多线程互斥

目录 一、前言 二、线程互斥 三、多线程访问临界资源所导致的问题 四、Mutex互斥量 1、锁的接口及其使用 定义一个锁(造锁) 初始化锁(改锁) 摧毁锁 上锁 解锁 锁的使用 五、锁的宏初始化 六、锁的原理 七、C封装互斥锁 八、可重入与线程…

conda指定路径安装虚拟python环境

DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…

鸿蒙 ArkUI实现地图找房效果

常用的地图找房功能,是在地图上添加区域、商圈、房源等一些自定义 marker,然后配上自己应用的一些筛选逻辑构成,在这里使用鸿蒙 ArkUI 简单实现下怎么添加区域/商圈、房源等 Marker. 1、开启地图服务 在华为开发者官网,注册应用&…

Kubernetes开发环境minikube | 开发部署apache tomcat web单节点应用

minikube是一个主要用于开发与测试Kubernetes应用的运行环境 本文主要描述在minikube运行环境中部署J2EE tomcat web应用 minikube start --force minikube status 如上所示,在Linux中启动minikube运行环境 service docker start docker version service docker …

Kafka为什么要放弃Zookeeper

1.Kafka简介 Apache Kafka最早是由Linkedin公司开发,后来捐献给了Apack基金会。 Kafka被官方定义为分布式流式处理平台,因为具备高吞吐、可持久化、可水平扩展等特性而被广泛使用。目前Kafka具体如下功能: 消息队列,Kafka具有系统解耦、流…

KUKA机器人如何修改程序并下载到机器人控制器中?

KUKA机器人如何修改程序并下载到机器人控制器中? 如下图所示,首先将使用的网卡的IP地址设置为自动获得, 打开workvisual软件,点击搜索,正常情况下可以搜索到项目文件,选中后双击进入, 如下图所示,此时,workvisual会自动从机器人控制器中下载项目文件到电脑上,耐心等待…

51单片机——8*8LED点阵

LED 点阵的行则为发光二极管的阳极,LED 点阵的列则为发光二极管的阴极 根据 LED 发光二极管导通原理,当阳极为高电平,阴极为低电平则点亮,否则熄灭。 因此通过单片机P0口可控制点阵列,74HC595可控制点阵行 11 脚 SR…

《Rust权威指南》学习笔记(三)

泛型和trait 1.泛型可以提高代码的复用能力,泛型是具体类型或其他属性的抽象代替,可以看成是一种模版,一个占位符,编译器在编译时会将这些占位符替换成具体的类型,这个过程叫做“单态化”,所以使用泛型的…

CentOS: RPM安装、YUM安装、编译安装(详细解释+实例分析!!!)

目录 1.什么是RPM 1.1 RPM软件包命名格式 1.2RPM功能 1.3查询已安装的软件:rpm -q 查询已安装软件的信息 1.4 挂载:使用硬件(光驱 硬盘 u盘等)的方法(重点!!!) 1…

【玩转全栈】----Django连接MySQL

阅前先赞,养好习惯! 目录 1、ORM框架介绍 选择建议 2、安装mysqlclient 3、创建数据库 4、修改settings,连接数据库 5、对数据库进行操作 创建表 删除表 添加数据 删除数据 修改(更新)数据: 获取数据 1、OR…

Supermaven 加入 Cursor:AI 编码新篇章

引言 2024 年 11 月 11 日,我们迎来了一个激动人心的时刻——Supermaven 正式加入 Cursor! 这一合作标志着 AI 编程工具进入了一个新的发展阶段,为开发者提供更智能、更高效的编码体验。本文将带您了解此次合并的背景、意义以及未来的发展方…

CM3/4启动流程

CM3/4启动流程 1. 启动模式2. 启动流程 1. 启动模式 复位方式有三种:上电复位,硬件复位和软件复位。 当产生复位,并且离开复位状态后,CM3/4 内核做的第一件事就是读取下列两个 32 位整数的值: 从地址 0x0000 0000 处取…