源码一般在哪里找(StarRocks 查询调度源码解析)

wufei123 发布于 2023-12-17 阅读(393)

导读:欢迎来到 StarRocks 源码解析系列文章,我们将为你全方位揭晓 StarRocks 背后的技术原理和实践细节,助你逐步上手这款明星开源数据库产品本期 StarRocks 源码解析将介绍 StarRocks 查询调度源码解析。

众所周知,StarRocks 是一个 MPP 架构, SQL 在通过 StarRocks 优化器阶段后得到实际执行的分布式物理计划,那么紧跟而来的问题就是:这个计划应该怎么执行?这个计划应该有多少机器参与执行?

这个计划中,哪些部分该给 A 节点执行?哪些部分应该给 B 节点执行?通过什么样的机制,将多机执行串联起来,一同协作完成整个计划的执行?为了解决这些问题,调度器应运而生本文将带领大家快速入门理解 StarRocks 的查询调度流程。

背景在正式介绍 StarRocks 的调度器之前,先简单介绍一下相关背景FragmentStarRocks 会将一个查询按照功能切分为多个 Fragment(查询片段),每个Fragment 负责整个查询中的一部分功能,整个查询计划至少会被拆分成一个Fragment,且每个 Fragment 可以按照不同的实例数执行。

最终,所有的 Fragment按照特定的流程执行完成后即可得到计算结果

MPP 多机并行执行StarRocks 的 MPP 多机并行执行则是基于上述 Fragment 完成的,FE 会将这些拆分的 Fragment 分发到多台不同的节点上执行,再通过 FE 协调这些 Fragment 的执行顺序,将这些机器的执行流程串联起来,完成整个查询工作。

所以对于每个执行节点而言,只需要知道:做哪些工作?用多少资源工作?工作完以后结果给谁?StarRocks 执行框架可以参考:StarRocks Pipeline 执行框架(上)StarRocks Pipeline 执行框架(下)

Optimizer在优化器阶段完成后,StarRocks 将 SQL 转换成了一颗分布式执行的物理计划,这个物理计划里说明了整个查询的执行顺序,执行流程,参与的功能节点以及工作方式但是这个计划却没有说明:。

计划应该给哪些机器执行?计划应该怎么拆分?优化器相关的解析可以参考:StarRocks 优化器代码导读整体流程StarRocks 调度器的流程主要包括:执行计划切分:将分布式物理计划切分成不同的子计划执行节点规划:规划各个子计划的执行节点,以及执行资源

执行流程调度:如何调度子计划执行执行计划切分执行计划切分主要是将优化器产出的分布式计划切分成不同的 Fragment,以便于每个 Fragment 负责整个执行计划的一部分切分 Fragment 的粒度通常是以物理执行计划中的 PhysicalDistribution 节点为主,PhysicalDistribution 节点通常意味着数据需要按照特定规则 re-shuffle,。

所以 Fragment 的切分也可以认为是按网络交互分段,Fragment和 Fragment 之间的操作需要通过网络进行(如下图中,Join的右孩子需要执行Broadcast操作,被单独切分为一个新的Fragment)。

当然,除了 PhysicalDistribute 节点会切分 Fragment,有的特殊节点也会拆分Fragment,例如 CTEConsume 节点,这里就不再详细叙述切分的代码可以参考:com/starrocks/sql/plan/PlanFragmentBuilder.java

执行调度器拆分完 Fragment 后我们来到调度器:com/starrocks/qe/Coordinator.java,其中最核心的代码当属exec():publicvoidexec()throwsException

{// prepare information prepare();// compute Fragment Instance computeScanRangeAssignment();computeFragmentExecParams

();// ...... // coordinator... }exec()方法的主要流程:计算每个 Fragment 的执行节点计算每个 Fragment 的执行实例规划 Fragment 和 Fragment 的连接关系

分发调度执行 Fragment接下来会逐步介绍每个流程选择 Fragment 的执行节点Fragment 执行节点选择分为两部分:带 Scan 节点的 Fragment不带 Scan 节点的 Fragment。

首先我们先解释带 Scan 节点的 Fragment 执行节点,其核心逻辑是根据执行计划中的 Scan 节点,选择数据所在的 BE 节点以及查询的 tablet 副本由于 StarRocks 规划场景比较复杂,目前支持以下几种选择方式:。

HDFSSelector:主要用于查询 Hive 外表,会根据分布信息选择节点ColocateSelector:Fragment 中的 Join 是 Colocate Join 时,使用该选择器Colocate Join 需要左右两表查询的 tablet 是分布在同一台机器上

计算左表的 Scan 节点在计算右表的 Scan 节点时,需要和左表保持一致

BucketSelector:当 Fragment 中的 Join 是 BucketShuffle Join 时,使用该选择器BucketShuffle Join 需要将右表的数据按照左表 Join-on 谓词的列 shuffle 到左表的机器上,

在计算左表的 Scan 节点时,需要存储左表的分布信息在计算右表的 Scan 节点时,需要按照左表的 bucket 信息进行分组,需要注意的是对于 Right/Full Join,有特殊的处理逻辑BucketSelector 和 ColocateSelector 的逻辑大致相同,所以代码直接复用了ColocateSelector

NormalSelector:在计算 Scan节点时,没有特殊要求,仅按照节点的负载(执行 Fragment 的个数)选择节点

这部分逻辑可以参考方法:Coordinator.computeScanRangeAssignment()其次对于不带 Scan 节点的 Fragment,意味着该 Fragment 的逻辑只涉及计算,不涉及访问储存,其选择节点的逻辑比较简单:

对于 Gather Fragment,只有一个执行节点不带 Scan 节点的 Fragment,和执行节点较多的孩子 Fragment 保持一致这部分逻辑和实例数计算混杂在一起,较为复杂,可以参考方法:。

Coordinator.computeFragmentHosts()计算 Fragment 的执行实例该部分主要计算每个 Fragment 的执行实例数,StarRocks 在 BE 上执行资源和实例数相关,实例数越多,执行线程越多,实例数计算受以下一些参数影响:

session 中的 parallel_exchange_instance_numsession 中的 parallel_fragment_exec_instance_numsession 中的 pipeline_dop

大致上的逻辑:对于 Gather Fragment,只有一个执行实例对于不带 Scan 节点的 Fragment,实例数和执行节点较多的孩子 Fragment 保持一致,但会考虑上述的参数对于带 Scan 节点的 Fragment,需要考虑 Scan 的 tablet 个数,以及考虑Bucket Shuffle Join 和 Colocate Join 的影响

这部分逻辑可以参考方法:Coordinator.computeFragmentHosts()构建 Fragment 的连接关系StarRocks 的 Fragment 是通过执行计划切分出来的,Fragment 和 Fragment 之间有数据交互,所以我们还需要给每个 Fragment 指定结果输出的目标,在 Fragment和 Fragment 之间建立起数据流向。

这部分逻辑可以参考方法:Coordinator.computeFragmentExecParams()调度&执行完成上述 Fragment 信息的构建后,最后一步就是将构建好的 Fragment 分发至对应的 BE节点。

其核心逻辑:构造 Output Fragment 用于输出数据构造 ResultReceiver 用于接收 BE 输出的数据按照执行树上自顶向下的顺序发送对应的 Fragmentpending 等待结果

需要注意的是,Fragment 执行是一个异步的流程,FE 发送 Fragment 的接口只保证Fragment 在 BE 创建好执行任务即可,不需要阻塞到 BE 执行完结果才返回这部分逻辑可以参考Coordinator.exec()

方法的后半程总结本文介绍了 StarRocks 调度器的主要流程:依据执行计划中数据的流转拆分Fragment,而 Fragment 又根据数据的分布特点选择不同的执行节点,对于特殊的 Join 方式(Bucket,Colocate)有不同的条件约束;在完成执行节点选择后,需要进一步计算每个节点内部的并行度,最后通过设置不同的目的端将各个 Fragment 流程串联起来,形成最终的执行流程。

本期 StarRocks 源码解析到这就结束了,好学的你肯定学会了一些新东西,又产生了一些新困惑,不妨留言评论或者加入我们的社区一起交流(StarRocks 小助手微信号)下一篇 StarRocks 源码解析,我们将为你带来 StarRocks Scan 算子源码解析。

亲爱的读者们,感谢您花时间阅读本文。如果您对本文有任何疑问或建议,请随时联系我。我非常乐意与您交流。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。