当前位置: 首页 > news >正文

StarRocks 是如何进行并行计算

我们来深入浅出地讲解一下 StarRocks 是如何进行并行计算的。

StarRocks 的并行计算能力是其高性能的核心,它主要基于 ​​MPP(大规模并行处理)​​ 架构,并结合了​​向量化执行引擎​​。简单来说,它的并行计算可以概括为 ​​“数据分布与计算并行”​​ 和 ​​“执行引擎优化”​​ 两个层面。


1. 核心基础:MPP 架构

MPP 架构的核心思想是将任务分解,分配到多个计算节点上并行执行,最后将结果汇总。StarRocks 集群由两种节点角色组成(物理上可以混合部署):

  • ​FE(Frontend)​​:负责元数据管理、查询解析、查询规划(生成执行计划)和调度。

  • ​BE(Backend)​​:负责数据存储、SQL执行(计算任务)。

当一条查询到来时,并行计算的过程如下:

步骤一:查询解析与规划

FE 接收到 SQL 查询后,会进行解析和优化,生成一个分布式的​​并行执行计划​​。这个计划会被拆分成多个逻辑或物理的​​执行片段(Fragments)​​。

步骤二:计划分发与调度

FE 将这些执行片段调度到存有相关数据的所有 BE 节点上。​​同一个 Fragment 会在多个 BE 上启动多个实例并行执行​​。

步骤三:数据并行读取(Scan)

每个 BE 实例只读取本地存储的数据分片(Tablet)。这是因为 StarRocks 的表数据是分布式存储的。

步骤四:并行计算与数据交换(Shuffle)
  • ​本地聚合​​:每个 BE 实例先对自己本地的数据进行计算(如过滤、聚合等)。

  • 数据重分布(Shuffle)​:如果计算需要跨节点数据(如 GROUP BY一个非分区键的字段,或 JOIN操作),BE 节点之间会通过网络进行数据交换,将相同键的数据发送到同一个 BE 节点上进行下一步聚合。这一步是 MPP 并行的关键。

  • ​多阶段聚合​​:对于大规模数据,聚合通常分两阶段进行:

    1. ​本地聚合​​:每个 BE 实例先进行本地预聚合,减少需要网络传输的数据量。

    2. ​全局聚合​​:多个 BE 的预聚合结果被交换到少数节点进行最终合并。

步骤五:结果汇总

最终的计算结果由少数 BE 节点汇总,返回给 FE,再由 FE 返回给客户端。

​举个例子:​​ 执行 SELECT region, SUM(amount) FROM sales GROUP BY region;

  1. 每个 BE 节点并行扫描本地的 sales表数据分片。

  2. 每个 BE 对本地的数据先计算一个部分的 SUM(amount),按 region分组(本地聚合)。

  3. 所有 BE 将本地聚合的结果(按 region分组)通过网络 ​​Shuffle​​ 到下一组节点。比如,所有 region=‘beijing’的数据都被发送到 BE1,所有 region=‘shanghai’的数据都被发送到 BE2。

  4. BE1、BE2 等节点对接收到的同一 region的数据进行最终聚合(全局聚合)。

  5. 最终结果返回给协调节点,输出给用户。


2. 实现并行的关键机制

a) 数据分布(分区和分桶)

这是并行计算的基础。表数据必须被有效地分布到不同 BE 节点上。

  • ​分区(Partitioning)​​:按时间等维度将表划分成不同分区(如按天),主要用于分区裁剪,减少数据扫描量。

  • ​分桶(Bucketing)​​:在一个分区内,数据通过哈希规则分布到多个 ​​Tablet​​ 中。​​Tablet 是数据移动、复制和计算的最小单元​​。

    • 每个 Tablet 在集群中会有多个副本,存储在不同的 BE 上。

    • 当执行查询时,每个 Tablet 的计算任务都可以被调度到不同的 BE 上并行执行。

​正是通过分桶,将数据打散成多个 Tablet,为并行计算提供了可能。​

b) 向量化执行引擎

传统的数据库执行引擎是逐行处理(一次处理一行数据),这会导致大量的函数调用开销。StarRocks 实现了​​向量化执行引擎​​:

  • ​批量处理​​:计算操作(如过滤、聚合)不再是单行处理,而是一次处理一批数据(比如 2048 行)。

  • ​CPU 缓存友好​​:按列组织的数据在批量处理时,能更好地利用 CPU 缓存,减少内存访问延迟。

  • ​SIMD 指令优化​​:单条指令可以处理多条数据,现代 CPU 的 SIMD 指令可以进一步提升计算密度和速度。

​向量化引擎极大地提升了单个 CPU 核心在单个 Fragment 实例上的计算效率,是 MPP 并行计算的“加速器”。​

c) Pipeline 并行执行引擎

在较新的版本中,StarRocks 引入了 Pipeline 执行引擎,进一步优化了并行调度:

  • ​传统火山模型​​ 的缺点是阻塞操作(如 Shuffle 的发送和接收)会导致线程等待,资源利用率不高。

  • ​Pipeline 引擎​​ 将执行计划拆解成多个 Pipeline Task,这些 Task 可以异步执行。当一个 Task 产生数据后,可以立即被下一个 Task 消费,避免了不必要的线程阻塞和上下文切换,极大地提升了 CPU 利用率和整体吞吐量,尤其是在高并发场景下。


总结

StarRocks 的并行计算是一个多层次、协同工作的系统:

层次

技术

作用

​数据存储层​

分区与分桶(Tablet)

将数据物理打散,为并行计算提供基础。

​查询规划层​

MPP 查询规划器(FE)

将查询拆分成多个可并行执行的 Fragment,并调度到多个 BE。

​计算执行层​

MPP 计算框架(BE)

多个 BE 节点同时执行计算任务,通过 Shuffle 进行数据交换。

​CPU 执行层​

向量化执行引擎

在单个 CPU 核心上,通过批量处理和 SIMD 优化,最大化单核效率。

​资源调度层​

Pipeline 引擎

优化任务调度,避免阻塞,提高 CPU 利用率和并发能力。

简单来说,StarRocks 的并行计算就是:​​先将数据分布到集群各个节点(分库分表的思想),然后让所有节点一起算(MPP),并且在每个节点上使用最先进的单核计算技术(向量化)来加速,最后通过高效的调度(Pipeline)把资源利用率提到最高。​​ 这种组合拳使得 StarRocks 在处理复杂分析查询时能够实现极致的性能。

​Pipeline 执行引擎​

简单来说,Pipeline 引擎是 StarRocks 用于​​替代传统火山模型​​的一种更先进的查询执行模型。它的核心目标是​​解决传统模型的阻塞点问题,极大地提高 CPU 利用率和系统并发处理能力​​。

为了更好地理解 Pipeline 引擎,我们首先要看看它要解决的问题。


1. 传统执行模型:Volcano 模型(迭代器模型)及其瓶颈

在 Pipeline 引擎之前,大多数数据库(包括早期 StarRocks)使用类 Volcano 模型。

  • ​工作方式​​:执行计划由一个一个的操作符(Operator)组成,例如 TableScan(扫描数据)、Filter(过滤)、Aggregation(聚合)、Exchange(数据交换)等。每个操作符都实现一个 next()接口。

  • ​执行过程​​:查询执行就像一棵由操作符构成的树被拉取数据。从根节点(输出节点)开始,调用其子节点的 next()方法来获取一行数据,子节点再调用它自己的子节点,如此递归到最底层的 TableScan。数据则像火山喷发一样,一行行地从底层被“拉”到顶层。

​这种模型的瓶颈在于“阻塞”(Blocking)操作​​:

某些操作符必须​​收到所有数据后​​才能进行下一步。最典型的有:

  • ​排序(Sort)​​:需要对整个数据集进行排序。

  • ​聚合(Aggregation)​​:特别是哈希聚合,需要建完整个哈希表后才能输出。

  • ​Exchange(数据交换)​​:接收端需要等待发送端把所有数据都传过来。

​问题所在​​:当执行遇到一个阻塞操作符时,执行线程(Thread)必须​​停下来等待​​,直到这个操作完成。在这个过程中,CPU 资源就被闲置了,线程只是空等。这在高并发场景下尤其致命,因为线程是宝贵资源,大量线程处于等待状态会导致系统吞吐量急剧下降。


2. Pipeline 引擎的核心思想:打破阻塞

Pipeline 引擎的设计思想非常巧妙:​​将整个执行计划切分成一系列非阻塞的、可以流水线式执行的“片段”,每个片段称为一个 Pipeline​​。

关键概念:Pipeline 的划分

执行计划会被打破重组为多个 Pipeline。划分的原则是:​一个 Pipeline 由一组非阻塞的操作符(Operator)组成,直到遇到第一个阻塞操作符为止​

例如,一个包含 Scan -> Filter -> Aggregate -> Exchange -> Sort的计划,可能会被划分为两个 Pipeline:

  • ​Pipeline 1​​: Scan -> Filter -> AggregateAggregate如果是哈希聚合,可能是阻塞点,但StarRocks做了优化,这里先理解为Pipeline的终点)

  • ​Pipeline 2​​: Exchange Receiver -> Sort

实际上,更常见的划分是在 ​​Exchange​​ 操作符处。Exchange 是 MPP 架构中网络数据传输的操作符,天然是一个阻塞点(接收方需要等待发送方)。

  • ​上游 Pipeline​​:Scan -> Filter -> [Local Aggregation] -> Exchange Sender。这个 Pipeline 负责生产数据。

  • ​下游 Pipeline​​:Exchange Receiver -> [Final Aggregation] -> Sort。这个 Pipeline 负责消费数据。

核心机制:数据驱动和异步化
  1. ​流水线执行​​:每个 Pipeline 被调度为一个或多个 ​​Pipeline Task​​,交给 CPU 线程池执行。

  2. ​数据流动​​:上游 Pipeline Task 处理完一批数据后,无需等待整个查询结束,可以立即将这批数据放入一个“队列”(即 BlockingQueue)中。

  3. ​异步消费​​:下游 Pipeline Task 无需等待上游任务全部完成,它可以​​异步地​​从队列中获取已经就绪的批次数据进行计算。

  4. ​避免线程阻塞​​:如果下游任务准备就绪但队列为空,它可以挂起(让出 CPU);如果上游任务准备就绪但队列已满,它也可以挂起。​​调度器会迅速将 CPU 时间片分配给其他就绪的 Task​​。

这样一来,CPU 几乎总是在“忙碌”状态,而不是“等待”状态。多个 Pipeline 就像工厂的流水线一样,同时运转,上游工序的产品直接传给下游工序,实现了高度的并行重叠。


3. Pipeline 引擎带来的巨大优势

  1. ​极高的 CPU 利用率​​:通过异步数据交换和流水线执行,最大限度地减少了线程空闲和阻塞等待,使 CPU 持续处于工作状态。

  2. ​稳定的高并发​​:这是最重要的优势之一。传统的阻塞模型下,并发查询越多,处于等待状态的线程也越多,容易导致线程耗尽和系统颠簸。Pipeline 引擎由于线程不再长时间阻塞,可以高效地利用有限的线程资源(通常与CPU核数相近)来服务大量的并发查询。

  3. ​更低的查询延迟​​:对于数据能够源源不断产生的场景,结果可以更快地开始返回给用户,减少了首包时间。

  4. ​更好的资源隔离和控制​​:调度器可以更精细地管理每个 Pipeline Task 的执行,为资源组管理提供了更好的基础。

总结与类比

特性

传统 Volcano 模型

Pipeline 引擎

​执行方式​

​拉取模型​​:从根节点向下拉取数据。

​推送模型​​:数据在 Pipeline 内被推送处理。

​并行单位​

整个 Fragment 由一个线程执行。

一个 Pipeline 被拆成多个 Task 并行执行。

​关键问题​

​阻塞操作​​导致线程空等,资源利用率低。

​异步流水线​​,避免阻塞,资源利用率高。

​并发能力​

低。受限于线程数量,高并发下性能急剧下降。

​非常高​​。少量线程即可服务高并发查询。

​类比​

​单条手工作坊生产线​​:一个工人必须完成一步才能交给下一步,中间有等待。

​现代化汽车装配流水线​​:多个工序同时进行,工件在流水线上流动,工人(CPU)持续工作。

​结论​​:Pipeline 执行引擎是 StarRocks 实现极致性能,特别是​​高并发查询​​场景下的关键技术。它与 ​​MPP 架构​​ 和 ​​向量化引擎​​ 协同工作,共同构成了 StarRocks 强大的数据分析能力的基石:

  • ​MPP​​ 解决了节点间的并行问题。

  • ​向量化​​ 解决了单核的计算效率问题。

  • ​Pipeline​​ 解决了线程资源的调度和利用率问题。

这三者结合,使得 StarRocks 能够充分挖掘现代多核CPU和集群硬件的潜力。

http://www.dtcms.com/a/453030.html

相关文章:

  • 私域整体结构的顶层设计:基于“开源AI智能名片链动2+1模式S2B2C商城小程序”的体系重构
  • 基于SpringBoot和Vue的超市管理系统
  • wordpress系统安装教程上海网站排名优化费用
  • 【线程池】——实用场景
  • ip address dhcp-alloc 概念及题目
  • 深入解析:JavaScript中typeof与instanceof的原理及区别
  • C++ 位运算 高频面试考点 力扣137. 只出现一次的数字 II 题解 每日一题
  • 商城网站开发与设计郑州seo外包阿亮
  • 自建本地DNS过滤系统:实现局域网广告和垃圾网站屏蔽
  • 《投资-90》价值投资者的认知升级与交易规则重构 - 第三层:DCF算的未来多少年的现金总和?
  • 网站开发的套路龙腾盛世网站建设
  • .NET周刊【9月第3期 2025-09-21】
  • 建站模板哪里好关于音乐的个人网站
  • 力扣第470场周赛
  • leetcode滑动窗口(C++)
  • 企业网站建设代理公司intitle 网站建设
  • 多模卫星导航定位与应用-原理与实践(RTKLib)6
  • PSP用PS1(PSX)中文游戏合集
  • 吴恩达机器学习课程(PyTorch适配)学习笔记:1.3 特征工程与模型优化
  • golang面经——GC模块
  • 微信小程序中的双线程模型及数据传输优化
  • 网站建设最流行语言电商网站设计岗位主要是
  • 《投资-77》价格投机者如何重构认知与交易准则 - 现成的常见工具
  • 专业的手机网站建设公司排名搜狐快站怎么做网站
  • 测试Meta开源的 OpenZL 无损压缩框架
  • vue3 两份json数据对比不同的页面给于颜色标识
  • XSLFO 流:从XML到PDF的转换之道
  • 2025-10-7学习笔记
  • 基于websocket的多用户网页五子棋(七)
  • 做网站pyton电子商务网站建设收获