Pipeline执行引擎模型


发布于 2024-08-05 / 109 阅读 / 0 评论 /
Pipeline 是一种执行引擎模型,是通过将复杂的计算链路拆分成多个小部分,通过各种手段来执行 Pipeline 中的任务完成高效率的计算。

pipeline 本质上就是将计算任务抽象成一个 DAG,然后将每个节点抽象为一个 TASK,pipeline 将完成任务之间的调度执行顺序和数据传输。

1.Pipeline简介

Pipeline 调度与 MPP 调度之间存在着明显的差异,前者是单机多核调度,后者是分布式集群的多机调度。总结下来,Pipeline 调度的目的包括三点:

(1)降低计算节点的任务调度代价;

(2)提升 CPU 利用率;

(3)充分利用多核计算能力,提升查询性能、自动设置并行度、消除人为设置并行度的不准确性。

Clickhouse, StarRocks, Doris, Morsel, Databend, Datafusion, DuckDB 对于 pipeline 都有不同程度的实现。

2.ClickHouse中对Pipeline的实现

下图表示了一个计算任务之间的有向无环图,也就是一个 pipeline

整个计算链路串起来叫做 pipeline,图中的每个方框内的算子叫做 processor,可以来处理一个计算任务,Ports 代表 processor 之间的数据连接。

注意每个 processor 都可以有一个或者多个 input ,可以有一个或者多个输出,也就是 pipeline 的变换是非常灵活的,可以 1 -> 1, N -> 1, 1 -> N。

这里介绍图中没有的另一个概念:pipeline breaker,所谓 pipeline breaker 就是在多个 pipeline 的执行的时候不能顺畅的执行下去,需要等这个同步的点执行完毕才能继续执行。

3.Doris中对Pipeline的实现

如下图所示,Pipeline 执行引擎基于多核 CPU 的特点,重新设计由数据驱动的执行引擎

具有以下特点:

(1)将传统 Pull 拉取的逻辑驱动的执行流程改造为 Push 模型的数据驱动的执行引擎。

(2)阻塞操作异步化,减少了线程切换,线程阻塞导致的执行开销,对于 CPU 的利用更为高效。

(3)控制了执行线程的数目,通过时间片的切换的控制,在混合负载的场景中,减少大查询对于小查询的资源挤占问题。

从而提高了 CPU 在混合负载 SQL 上执行时的效率,提升了 SQL 查询的性能。