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 查询的性能。