背景

最近在这家公司做了一些事情,做的事情和以往的工作不太一样,不一样的点呢就是 之前我主要的工作是关注计算这方面,因为数据量大,研究的是怎么加速查询,怎么研究规则去优化,怎么去解规则的bug等等。因为现在业务的不同,每次获取的数据量比较小,更加关注的索引效率,计算方面可能只是一些简单的SUM AVG等。
接下来谈谈我对这个计算存储引擎的理解与认知:

什么是SQL计算存储引擎

SQL计算存储引擎是利用SQL的能力进行计算,而用户无需担心后台计算的细节,而且计算需要用到的数据都是在这个计算存储引擎里。
它包括两个部分,一个是计算部分:包括SQL解析,SQL优化,SQL执行; 一个是存储部分,包括数据格式的存储,数据的获取。

SQL计算以及优化

如果单纯从计算的角度来说话的,这类的引擎典型的有 Spark离线引擎,Flink实时引擎,presto adhoc引擎, 这种不关心数据的存储,也就是说这类没有存储能力。这种往往在运行的时候,是从远端拉取数据,拉数据数据来以后再进行计算。
从大的方面来说,SQL计算引擎 一般会包括任务调度和SQL计算。

任务调度

任务调度的模式一般包括 Spark 的 StageByStage 调度模式 和Flink 的 AllAtOnce 调度模式。
第一种模式:stageByStage, 这种是典型的离线调度模型,这种调度模型的运行方式为 一组任务按照Stage的方式进行组织,只有上一个Stage的所有Task运行完了以后下一个Stage才能继续执行,这种方式的好处是任务的失败的容错性高,因为stage与stage之间的数据交互会进行暂存,一个任务或者stage的失败,可以继续从容错点恢复重试执行。而且这种方式可以充分利用数据的亲和性,也就是说,下游stage的任务可以依赖上游任务的分布情况来进行调度,比如说把下游Task调度到上游Task运行的节点上,这样一来,就无须再进行远程数据的拉取,直接从本地读取数据,可以减少数据的拉取时间.
这种模式下,任务的调度和执行是穿插在一起的。
在这里插入图片描述

第二种模式:AllAtOnce,这种模式是典型的流式调度模型,也就是在任务执行之前,调度器会根据策略进行Task的调度了,这个时候每个任务在哪个节点执行都已经固定好了,之后所有的数据处理就像流水线一样,来一个处理一个,这个阶段Task的调度就是闲置状态。所以这种模式的时效性很好,数据的延迟低。但是如果Task失败或者task所在的容器重启了,这个时候调度器会重新调度Task。
在这里插入图片描述

SQL计算

SQL计算的话,一般会包括SQL部分,以及SQL转换成引擎底层API的部分,从整个引擎的发展来看,一般是先提供API接口,用户写底层的API进行调用,后着才慢慢的出现SQL引擎,这种SQL使用起来对用户是友好的,当然这后面逻辑的转换也会经过很多步骤:

  • SQL解析为AST
  • AST转为逻辑计划
  • 逻辑计划优化为优化计划
  • 优化计划换转为物理计划
  • 物理计划转换为可执行的底层API

这种SQL的解析,目前从大部分开源框架的用的趋势来看,ANTLR4 是主流,只有一小部分,比如说Flink 用的是 Calcite,不得不说 ANTLR4还是挺好用的,这个阶段主要是判断语法的合规性,是不是符合定义的语法规则。
再者是 AST转换为逻辑计划,这个阶段主要是y结合元数据做一些校验,比如说 检查表存不存在,字段合不合理,函数存不存在等。

优化计划这一部分,这里面包括的内容就比较多了,但是一般来说,一种是基于规则的(RBO),一种是基于代价的(CBO)的。
这两种也不是非黑即白的,主要看侧重于那一方。
比如说,Spark主要是RBO,但是在join转换的部分,也是会基于CBO的(AQE),AQE也就是说基于运行时的指标信息来及时调整运行的计划以达到更好的加速效果。
又比如说 StarRocks 主要是基于CBO的,但是这种CBO的话,也是在RBO规则的下的,比如说这种常量折叠等这种都是RBO。而且这种CBO也有一部分是估算的,也没有精确的数值。

优化计划转换为物理计划这一块,这一块主要是转换为可执行的物理计划,也就是说这里的物理计划都是可以执行了,调用某个方法就会返回对应的API的调用,比如说
Spark中RowDataSourceScanExec这里的doExecute方法就是返回RDD,Flink也是如此。
当然这里还有一个很大的部分就是代码生成,这里主要就是为了减少虚函数的调用而采用的一种提速的方法,这种是因为JVM语言存在多态函数的二次寻址。

SQL优化

这一部分主要是从以下方面来优化

  • 使获取的数据尽可能的少,减少计算的数据量
  • 使中间任务传输的数据尽可能的少,减少传输带来的开销
  • 尽量减少shuffle的数据量,或者消除shuffle
  • 减少shuffle所需要的时间

比如说
hashjoin转换为 broadcastJoin 就是 消除shuffle
hashjoin转为换sortmergejoin 就是减少shuffle需要的时间
runtimefilter 就是减少传输的数据量
谓词下推 就是使获取的数据尽可能的少

数据的存储与索引

对于没有自身存储系统的计算引擎

这种引擎其实是没没有索引一说的,因为你无法快速的定位到某一行数据,这种如果想加速的话,只能依靠存储系统的本身一种快读过滤机制,就拿现在流行的数据湖来说,如paimon或者delta,他们的底层文件存储是列式存储,比如说parquet。
这种引擎如果想快速的过滤出出数据的话,得依靠parquet这个底层文件系统自带的统计信息,比如说最大最小值,又或者说布隆过滤器(Bloom Filter),这些是基于rowgroup级别的来的,也就是说这些过滤器能够做到快读的跳过文件。
或者从计算层级来加速,比如说字典编码,这种把String的比较转换为整数的比较。
当然也可可以通过文件的布局来进行加速,比如说Zorder

对于带有自身存储的计算引擎

这种引擎的话,大部分是存算一体的,也就是说计算和存储耦合在一起,这种引擎在写入数据的时候,往往会进行索引的建立,比如说主键索引(能够快速定位到某一行数据),bitmap索引(能够快读定位过滤条件所在的行),聚簇索引(能够根据聚簇键进行快速查询)。
但是需要注意的是,这种索引是需要单独维护的,尤其在大量数据更新的场景下,索引的维护也需要一定的开销。不像前者,前者是把这些信息存储在文件的元数据信息里。

点查

这里需要单独说一下这个点查,大部分都是通过主键来查找来达到点查的效果的。
这里的如果要有点查的效果,必须是针对于带有自身粗处的计算引擎。
以上所过,我们写完SQL以后会进入到优化器以及调度环节,但是对于点查不一样,它只需要简单的优化,调度环节的的话直接越过。
为什么跳过呢?
因为我们是简单的查询,没有计算,只需要查询对应的数据,无需要进行Task的调度。就拿Starrocks来说,一个SQL的调度可能就需要花费20多毫秒

- -- Deploy[1] 23ms-     -- DeployLockInternalTime[1] 23ms-         -- DeploySerializeConcurrencyTime[1] 0-         -- DeployStageByStageTime[3] 0-         -- DeployWaitTime[3] 23ms-             -- DeployAsyncSendTime[1] 0

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

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

相关文章

vscode.window.activeTextEditor 获取不到 png 图片路径问题

vscode 的 extensions 插件开发时用 vscode.window.activeTextEditor?.document.uri 获取不到编辑器打开的图片路径,文档路径可以获取到。个人猜测因为图片不能编辑,所以没有 activeTextEditor 属性吧。解决办法:巧用右键获取路径和相对的路…

Java 大视界 -- Java 大数据在智能医疗手术机器人操作数据记录与性能评估中的应用(390)

Java 大视界 -- Java 大数据在智能医疗手术机器人操作数据记录与性能评估中的应用(390)引言:正文:一、传统手术机器人的 “黑箱困境”:记不全、算不清、追不到1.1 设备与临床的 “断层”1.1.1 数据记录 “太粗放”1.1.…

C++的结构体指针

结构体变量和结构体指针的区别特性结构体变量结构体指针存储内容结构体的实际数据内存地址内存开销结构体总大小固定4/8字节(指针大小)成员访问运算符.->函数传参时的行为值拷贝(新副本)地址传递(操作原数据&#x…

pdf文件转word免费使用几个工具

在线工具(无需安装) Smallpdf ✅ 核心功能: 网页端直接操作,支持 PDF 与 Word 格式互转 免费用户每日限 2 次转换(免注册) 自动清除服务器文件,确保隐私安全 🔗 访问链接&#xff1a…

Vue3 组件化开发

文章目录前言组件化开发底部菜单 TabMenu父子组件相互传数据父传子:自定义属性子传父:自定义事件父子组件互传案例插槽 slot多个插槽总结组件化开发总结Vue组件的基本组成子组件使用的三个步骤父子组件相互传递数据前言 提示:这里可以添加本…

服务器硬件电路设计之I2C问答(二):I2C总线的传输速率与上拉电阻有什么关系?

I2C 总线传输速率与上拉电阻关系密切。上拉电阻阻值决定总线电平切换速度:电阻越小,充放电电流越大,信号边沿更陡,支持更高速率(如 400kHz 快速模式);电阻过大则切换慢,限制速率&…

大语言模型提示工程与应用:LLMs文本生成与数据标注实践

提示词应用实践 学习目标 本课程通过LLMs生成情感分析样本和标注葡萄9品鉴数据,展示了其文本生成和数据标注能力。同时,利用PAL模型解决日期计算问题,学习了LLMs与编程运行时结合实现复杂推理的方法,为自然语言处理应用提供了实…

node.js 零基础入门

Node.js 零 基础入门与核心语法 适用对象:完全没接触过 Node.js 的同学 目标:从 0 到能写 CLI、小型 HTTP 服务、文件脚本、调用系统/网络资源 目录 什么是 Node.js安装与运行运行脚本与 REPL模块体系:CommonJS 与 ES Modules基础语法在 Node…

《Day3-PyTorch 自动微分入门:从计算图到梯度下降的实践指南》

八、自动微分自动微分模块torch.autograd负责自动计算张量操作的梯度,具有自动求导功能。自动微分模块是构成神经网络训练的必要模块,可以实现网络权重参数的更新,使得反向传播算法的实现变得简单而高效。1. 基础概念张量Torch中一切皆为张量…

apache cgi测试

test.cgi #!/bin/sh echo "Content-type: text/html" echo "" echo "<h1>Hello from a Mac CGI script!</h1>" echo "<p>Current time is: $(date)</p>"ƒ% 放置目录 /opt/homebrew/Cellar/mapserver/8.4.0_1…

力扣 30 天 JavaScript 挑战 第二题笔记

这道题是涉及知识–闭包 1. 闭包定义以及相关知识点 官方定义为&#xff1a;在 JavaScript 中&#xff0c;函数具有对在相同作用域以及任何外部作用域中声明的所有变量的引用。这些作用域被称为函数的 词法环境。函数与其环境的组合被称为 闭包。 简单理解&#xff1a;内层函数…

OpenAI GPT-5 深度解析:API Key定价与ChatGPT(Free, Plus, Pro)用户的区别

前言&#xff1a;两年等待&#xff0c;只为这一跃 在科技圈长达两年的屏息期待与无尽猜想之后&#xff0c;2025年8月8日北京时间凌晨&#xff0c;OpenAI终于揭开了其新一代旗舰模型——GPT-5的神秘面纱。这不仅仅是一次常规的产品迭代&#xff0c;更被整个行业视为一块试金石&a…

ClickHouse集群部署实践---3分片2副本集群

ClickHouse集群部署实践—3分片2副本集群 未完待续。。。 喜欢的先点赞收藏&#xff01;&#xff01; 由于我们准备部署的是3分片2副本的集群&#xff0c;现在来解释一下配置参数的意思&#xff1a; shard标签代表分片的意思&#xff0c;如上图我们有3个分片&#xff0c;clickh…

Unity_VR_Pico开发手册

文章目录一、配置开发环境1.下载PICO Unity Integration SDK2.安装 Unity 编辑器&#xff08;添加安卓开发平台模块&#xff09;3.导入下载的SDK4.项目配置和切换开发平台5.导入 XR Interaction Toolkit6.安装 Universal RP(通用渲染管线)并设置 (选做)二、调试环境搭建&#x…

Linux系统之Docker命令与镜像、容器管理

目录 一、 Docker命令 docker命令帮助 docker常用子命令&#xff08;必须背会&#xff09; docker管理子命令(暂时不需要) swarm集群管理子命令&#xff08;不需要&#xff09; docker容器管理子命令&#xff08;必须背会&#xff09; docker全局选项 二、 docker镜像管…

比亚迪第五代DM技术:AI能耗管理的深度解析与实测验证

比亚迪第五代DM技术&#xff1a;AI能耗管理的深度解析与实测验证 &#xff08;面向新能源汽车研发/测试工程师&#xff09;目录 技术背景与核心突破AI能耗管理系统架构解析关键技术创新点 2.1 动力域三脑合一控制2.2 全温域热管理协同2.3 导航数据深度耦合 实测数据与场景验证 …

sqli-labs通关笔记-第37关POST宽字符注入(单引号闭合 手工注入+脚本注入 3种方法)

目录 一、宽字符注入 二、sqlmap之unmagicquotes 三、addslashes与mysqli_real_escape_string 四、源码分析 1、代码审计 2、SQL注入安全性分析 五、渗透实战 1、进入靶场 2、正确用户名密码探测 3、手工注入&#xff08;方法1&#xff09; &#xff08;1&#xff…

Kubernetes 集群密钥与机密管理方案对比分析:Vault、Sealed Secrets 与 AWS KMS

Kubernetes 集群密钥与机密管理方案对比分析&#xff1a;Vault、Sealed Secrets 与 AWS KMS 在容器化与编排环境中&#xff0c;机密&#xff08;Secrets&#xff09;管理是确保应用安全性的重要环节。对于 Kubernetes 集群而言&#xff0c;内置的 Secret 对象存在明文存储的风…

Java基础-TCP通信单服务器接受多客户端

目录 案例要求&#xff1a; 实现思路&#xff1a; 代码&#xff1a; User类&#xff1a;用户端 Client类&#xff1a;服务端 ServerReader类&#xff1a;多线程通信类 总结&#xff1a; 案例要求&#xff1a; TCP通信下,正常的写法只能单个服务器和单个客户端进行通信&a…

electron:vue3+vite打包案例

1、安装electron 首先设置镜像源&#xff0c;否则安装会非常非常慢。 打开npm的配置文件。 npm config edit 修改配置项。 registryhttps://registry.npmmirror.com electron_mirrorhttps://cdn.npmmirror.com/binaries/electron/ electron_builder_binaries_mirrorhttp…