2.分布式执行
分布式执行的关键思想是如何从逻辑执行计划到物理执行计划,这里主要涉及两个方面的处理:一个是计算的分布式处理;另一个是数据的分布式处理。
一旦生成了物理计划,系统就需要将其拆分并分布到各个 Node 之间进行运行。每个 Node 负责本地调度输入和计算资源。Node 还需要彼此之间能够通信以将输出连接到输入,这里需要一个网络流接口来连接这些组件。为了避免额外的同步成本,需要足够灵活的执行环境以满足上面的所有操作,以便不同的 Node 除了执行计划初始的调度,还可以相对独立地启动相应的数据处理工作,而不会受到协调节点的其他编排影响。
数据库集群中的协调节点会创建一个调度器,它接收一组物理计划对应的查询请求片段,设置输入和输出相关的信息,创建本地计算资源并开始执行。
在 Node 对输入和输出数据进行处理的时候,需要对该查询请求进行控制,以拒绝请求中的某些查询类型。
对于跨节点的执行,协调节点首先会序列化对应的物理查询请求片段,并通过网络通信接口发送到远端 Node,远端 Node 接收后,会先还原物理查询请求,并创建其包含的本地计算资源和交互使用的 stream(TCP 通道),完成执行框架的搭建,之后开始由协调节点发起驱动多节点计算。多个物理查询请求通过协调节点进行异步调度,实现整个分布式框架的并行执行。对于本地执行, 其实就是并行执行,每个计算资源并发同步以及调用例程都可以作为多进程运行,它们之间由共享内存互联,可以缓冲信道以使生产者和消费者同步。
为实现分布式并发执行,数据库在执行时引入了 Background Worker 的功能,对于 Join 和 Aggregator 等复杂算子根据数据分布特征,实现了三种数据再分布方式,分别为镜像再分布、哈希再分布和范围再分布。通过数据再分布, 将算子内部拆分为两阶段执行,第一阶段在数据所在节点做部分数据的处理, 处理后的结果,根据算子类型会进行再分布,然后在第二阶段汇集处理,从而实现了单个算子多节点协作执行。




