Presto 之Pipeline

一. 前言

       我们知道在Presto中有个叫Pipeline的概念,Pipeline其实就是一条包含各个算子的流水线,如下所示。本文主要介绍在Presto中,Pipeline是如何划分的。

Presto 之Pipeline_第1张图片

二. Pipeline

        在Presto中,一个Stage中包括一个或者多个Pipeline,一个Pipeline中包括多个Driver,数据在同一个Pipeline的内部Driver间数据交换不需要经过网络,在pipeline与pipeline之间也只经过内存Exchange在本地进行数据交换即可。

三.  Pipeline切分

        Pipeline的管理都在LocalExecutionPlanner类中实现的,在Stage在生成Driver的时候,是否要切分成多个Pipeline时,主要遵循如下几个原则:

  1. 每个Stage至少有有1条Pipeline去执行,主要代码流程如下所示:

LocalExecutionPlanner::plan
    PhysicalOperation physicalOperation = plan.accept
        context.addDriverFactory     // Stage的主pipeline

         因为每个Stage都会调用LocalExecutionPlanner::plan生成Operator算子,因此可以保证每个Stage至少有一个pipeline来执行。

     2.  对于Exchange算子时增加一条Pipeline对Source进行并行处理。

LocalExecutionPlanner::plan
    PhysicalOperation physicalOperation = plan.accept
​       visitExchange 
​          createLocalExchange
​               context.addDriverFactory      // 对于exchange的source plan,新增一条pipeline处理

   

     3. 在处理Join算子时增加单独一条Pipeline执行Hash表的创建处理。

LocalExecutionPlanner::plan
   PhysicalOperation physicalOperation = plan.accept
​     visitJoin 
​        createLookupJoin
​            createLookupSourceFactory
​                 context.addDriverFactory   // 对于Hash表的构建,新产生一个pipeline处理	   

     4. 此外, 还有其他的一些算子也会切分pipeline,比如semi join等,但是原理和上边是一样的,因此不再重复叙述。

你可能感兴趣的:(presto,presto,OpenLookeng,trino,pipeline,大数据)