掌桥专利:专业的专利平台
掌桥专利
首页

一种pipeline并行调度执行中的扩展方法

文献发布时间:2023-06-19 18:37:28


一种pipeline并行调度执行中的扩展方法

技术领域

本发明涉及数据库系统技术领域,具体为一种pipeline并行调度执行中的扩展方法。

背景技术

pipeline在创建完成后不可修改,pipeline中的每个transformer在同一时间只能由一个工作线程驱动。在传统数据库系统中,参考图1中,一个Query处理流程大体是:Parse—Plan—Execute—Storage;在Plan阶段,往往会增加一个Pipeline组装(一个transformer代表一次数据处理)。

所有transformer被编排成一个流水线(pipeline),然后交给executor执行,每执行一个transformer数据集就会被加工并输出,一直到下游的sinker。有些数据库场景,总体的查询数有限,但数据规模大,更追求查询关联的每个pipeline的执行并行度。pipeline中的每个transformer同一时间只能由一个线程驱动执行。

transformer需要处理的输入数据量在构建pipeline时是很难得知的,有些transformer是需要得到所有的输入数据之后才能实际处理并输出(比如sort);但内存有限,所以输入的数据到一定量之后是需要落盘的,这样可能会在磁盘积攒很多数据;当输入数据全部得到之后,这个transformer其实是有大量工作需要做的,但一个transformer只能交给一个线程处理,线程数会成为这个transformer处理能力的瓶颈。

发明内容

(一)解决的技术问题

针对现有技术的不足,本发明提供了一种pipeline并行调度执行中的扩展方法,本提案中,一个pipeline交给executor后,executor申请一个固定线程数的线程池,executor采用灵活的调度策略,选择合适的transformer,交由工作线程组处理,使不同的查询生成的pipeline都可以使用相同的并行度,且并行度数量可控。pipeline在被executor调度执行过程中,可以动态扩展pipeline内部结构,适应单元在不同状态下的并发度处理需求,解决了背景技术中的提出的问题。

(二)技术方案

为实现以上目的,本发明通过以下技术方案予以实现:

一种pipeline并行调度执行中的扩展方法,包括:步骤1、PipelineExecutor单元创建,pipeline单元由外部生成,外部传入worker单元数量,PipelineExecutor单元内创建对应数量的worker单元及线程,每个worker单元关联一个线程;步骤2、从pipeline单元中的叶子节点寻找状态为Ready的transformer单元,按robin单元的方式向TaskQueue单元中的多个队列中放入;所述transformer单元包含多种状态,worker单元通过transformer单元的状态来决定对transformer单元的处理;

步骤3、通过worker单元从TaskQueue单元取transformer单元处理,在worker单元从TaskQueue单元中取transformer单元时,优先从自己关联的Queue单元中取,如果此Queue单元中无transformer单元,则从其他Queue单元中取;或者,以调用transformer单元中的work单元方式,驱动transformer单元对数据进行相应处理;步骤4、收集已处理transformer单元内有变更的ports单元;其中,transformer单元自身可能关联多个inputport单元、多个outputport单元;清除port单元的变更状态,便于transformer单元下一次的work单元函数处理。

进一步的,所述transformer单元包含如下状态:NeedData状态:transformer单元需要一些输入数据才能继续工作;PortFull状态:由于输出已满,transformer单元无法继续工作;Finished状态:所有工作已完成,无需再做其他事情;Ready状态:transformer单元将同步工作。

进一步的,所述transformer单元:数据的实际处理单元,按大类分为不包含输入的source单元、不包含输出的sink单元、包含输入输出的transformer单元;所述transformer单元处理过程中会与其自身的port单元进行交互,当port单元关联的PortState单元状态发生变化时,port单元会标记自身有变更。

进一步的,所述port单元为transformer单元的输入输出的对应实体,关联上下游的transformer单元,输入输出数据的管理;InputPort单元中存有记录与其关联的OutputPort单元;OutputPort单元中会记录与其关联的InputPort单元;相关联的InputPort单元、OutputPort单元,共同关联同一个PortState单元对象。

进一步的,所述PortState单元对象由其自身状态及其内部数据构成;其中,IS_NEEDED状态:表明PortState内部数据为空,需要外部提供数据;HAS_DATA状态:表明PortState内部数据存在,外部可以取出数据,进行处理;IS_FINISHED状态:表示外部已经处理完成,不需PortState存取数据;PortState中的数据,由与其相关的OutputPort放入,与其相关的InputPort取出;外部相关的transformer单元,通过与其相关的Port中的PortState对象的状态来决定自身的状态。

进一步的,检测已处理的transformer单元的状态,决定是否将此transformer单元放入到TaskQueue单元;在worker单元处理一个transformer单元的流程结束后,会继续通过此transformer单元的prepare判断其状态;当transformer单元状态为Ready状态时,则继续将此transformer单元放入到TaskQueue单元与其相关的Queue单元中。

进一步的,所述transformer单元将其他transformers单元添加到pipeline单元中;transformer单元中的prepare接口用于返回当前transformer单元的状态;transformer单元中的work单元接口用于当transformer单元状态为Ready时,transformer单元内部对输入数据进行相关处理,将处理完的数据放入相关的OutputPort单元。

进一步的,在pipeline单元中,一份数据的处理需要分多步完成,每一步对应一个transformer单元,transformer单元之间前后依赖;还存在workergroup单元:其由多个线程构成,具体线程数由外部指定;每个worker单元关联一个线程,从pipeline单元中,根据transformer单元的当前状态,选择处理的transformer单元,驱动transformer单元对数据的处理。

进一步的,存放状态为Ready单元的transformer单元形成了TaskQueue单元,所有worker单元共享同一个TaskQueue单元;TaskQueue单元内包含多个Queue单元,Queue单元数量与worker单元数据相同,每个worker单元关联一个Queue单元,在worker单元找到Ready状态的transformer时,只放入自己相关的Queue单元中,PipelineExecutor单元:处理pipeline单元的调度执行,workergroup单元由PipelineExecutor单元内部创建。

(三)有益效果

本发明提供了一种pipeline并行调度执行中的扩展方法,具备以下有益效果:

通过executor采用灵活的调度策略,选择合适的transformer,交由工作线程组处理,使不同的查询生成的pipeline都可以使用相同的并行度,且并行度数量可控,pipeline在被executor调度执行过程中,可以动态扩展pipeline内部结构,适应算子在不同状态下的并发度处理需求;

通过归并方式对多个输入进行全局排序,保证输出数据的整体有序;从最后一个inputport中接收数据,写入到第一个outputport中,从所有的输入(pipeline中的与其相关的多条线)取数据,通过归并方式对多个输入进行全局排序,保证输出数据的整体有序,最终将整体有序的数据输出给下游。

对pipeline的调度执行,不论pipeline本身简单或复杂程度,都可按照指定并行度调度执行;pipeline中某些transformer依赖全量输入数据才能处理且输入数据总量不确定的情况下,可以动态扩展该transformer,改变此transformer的并行处理能力。

附图说明

图1为本发明中的现有的Query处理流程示意图;

图2为本发明当前已经存在的一种pipeline调度执行方案流程示意图;

图3为本发明当前已经存在的另一种pipeline调度执行方案流程示意图;

图4为本发明可控并发度的pipeline调度的一种执行流程示意图;

图5为本发明可控并发度的pipeline调度的另一种执行结构示意图;

图6为本发明pipeline调度执行中的动态扩展流程示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

在现有的技术中,存在如下技术方案:

方案一的设计思路,如图图2所示:步骤1、将pipeline单元当中的每一个transformer单元抽象成一个迭代器;步骤2、每个迭代器都带有一个next单元方法;步骤3、每次调用这个方法将会返回这个pipeline单元产生数据;步骤4、一个线程在树的根节点不断地调用next单元方法来获得整个查询的全部结果。

方案二的设计思路,如图图3所示,设计思路如下:步骤1、在方案一的基础上,为了提升pipeline单元执行的并行度,每一个transformer单元单独由一个线程驱动执行;步骤2、transformer单元的输出放入到一个队列中,下一个transformer单元从队列中取数据,作为自己的输入。

从现有的技术方案来看,以上两个技术方案,存在如下问题:

方案一:对transformer单元抽象比较好,但整个pipeline单元只能由一个工作线程驱动执行,单机的多核不能运用;

方案二:在方案一的基础上,对并发度有所改进;但复杂度不同的查询,组成pipeline单元的transformer单元数量是不同的;单个pipeline单元对单机内线程资源的占用完全不可控。

请参阅图4及图5,本发明提供一种pipeline单元并行调度执行中的扩展方法,在本技术方案中:涉及以下模块或者单元:

transformer单元:数据的实际处理单元,按大类分为不包含输入的source单元、不包含输出的sink单元、包含输入输出的transformer单元;

其中,transformer单元包含多种状态,worker单元通过transformer单元的状态来决定对transformer单元的处理;NeedData状态:transformer需要一些输入数据才能继续工作;PortFull状态:由于输出已满,transformer无法继续工作;Finished状态:所有工作已完成(已经处理了所有数据或所有输出已关闭),无需再做其他事情;Ready状态:transformer将同步地做一些工作;

ExpandPipeline单元:transformer单元希望将其他transformers单元添加到pipeline单元中;transformer单元中的prepare单元接口用于返回当前transformer单元的状态;transformer单元中的work单元接口用于当transformer单元状态为Ready时,transformer单元内部对输入数据进行相关处理,将处理完的数据放入相关的OutputPort单元;

port单元:transformer单元的输入输出的对应实体,关联上下游的transformer单元,输入输出数据的管理;InputPort单元中会记录与其关联的OutputPort单元;OutputPort单元中会记录与其关联的InputPort单元;相关联的InputPort单元、OutputPort单元,共同关联同一个PortState单元对象。

PortState对象由其自身状态及其内部数据构成;

IS_NEEDED状态:表明PortState内部数据为空,需要外部提供数据;

HAS_DATA状态:表明PortState内部数据存在,外部可以取出数据,进行处理;

IS_FINISHED状态:表示外部已经处理完成,不需PortState存取数据了;

PortState中的数据,由与其相关的OutputPort放入,与其相关的InputPort取出;

外部相关的transformer,通过与其相关的Port中的PortState对象的状态来决定自身的状态。

pipeline单元:一份数据的处理需要分多步完成,每一步对应一个transformer单元,transformer单元之间有前后依赖关系;pipeline单元就是如何处理这份数据的整体表示。

workergroup单元:由多个线程构成,具体线程数由外部指定;每个worker单元关联一个线程,worker单元的主要职责是从pipeline单元中,根据transformer单元的当前状态,选择可以处理的transformer单元,驱动transformer单元对数据的处理。

TaskQueue单元:存放状态为Ready单元的transformer单元,所有worker单元共享同一个TaskQueue单元。

TaskQueue单元内包含多个Queue单元,Queue单元数量与worker单元数据相同,每个worker单元关联一个Queue单元,在worker单元找到Ready状态的transformer时,只放入自己相关的Queue单元中,PipelineExecutor单元:处理pipeline单元的调度执行,workergroup单元由PipelineExecutor单元内部创建。

在以上的内容的基础上,pipeline并行调度执行中的扩展方法中的整体处理流程如下:

创建及初始化PipelineExecutor单元:PipelineExecutor单元创建,pipeline单元由外部生成;

PipelineExecutor单元初始化:外部传入worker单元数量,PipelineExecutor单元内创建对应数量的worker单元及线程,每个worker单元关联一个线程;从pipeline单元中的叶子节点寻找状态为Ready的transformer单元,按robin单元的方式向TaskQueue单元中的多个队列中放入;

进一步的,worker单元从TaskQueue单元取transformer单元处理。

进一步的,worker单元从TaskQueue单元中取transformer单元时,优先从自己关联的Queue单元中取,如果此Queue单元中无transformer单元,则从其他Queue单元中取;或者,以调用transformer单元中的work单元方式,驱动transformer单元对数据进行相应处理。

所述transformer单元处理过程中会与其自身的port单元进行交互,当port单元关联的PortState单元状态发生变化时,port单元会标记自身有变更,用于后续处理。

同时,检测已处理的transformer单元的状态,决定是否将此transformer单元放入到TaskQueue单元;在worker单元处理一个transformer单元的流程结束后,会继续通过此transformer单元的prepare判断其状态;当transformer单元状态为Ready状态时,则继续将此transformer单元放入到TaskQueue单元与其相关的Queue单元中。

进一步的,收集已处理transformer单元内有变更的ports单元;其中,transformer单元自身可能关联多个inputport单元、多个outputport单元,从transformer单元这些port单元中,找出在处理期间发生变更的port单元并记录。

进一步的,清除port单元的变更状态,方便transformer单元下一次的work单元函数处理。

使用时,通过这些变更的port单元,得到与其关联的transformer单元,通过transformer单元的prepare单元的方法,判断这些transformer单元是否需要添加到TaskQueue单元中,从判断是否pipeline调度执行完成。

当TaskQueue单元内所有Queue单元为空,且所有worker单元为空闲状态(没有在处理的transformer单元,等待有新的transformer单元添加到TaskQueue单元),则说明pipeline单元调度执行完成;当外部主动调用PipelineExecutor单元中的cancel单元时,需先等待所有的worker单元当前处理的任务结束,之后pipeline单元调度执行就全部结束了。

一种pipeline并行调度执行中的扩展方法中,主体逻辑如下:以上以orderby单元的sort单元为例来说明expand单元的处理机制,这个pipeline单元的总体逻辑是将数据整体有序输出给下游单元;流程是先保证pipeline单元单条线内整体有序,最后pipeline单元所有的线的数据进行合并,保证整体有序;添加expand单元的主要原因在于pipeline单元单条线内的数据量可能很大,超过一定量的数据需要落盘,磁盘上可能积攒了很多文件;单条线上所有的数据接收完后,需要并发的处理这些落盘的文件,使pipeline单元的单条线内整体有序的对下游单元输出。

需要的说明的是:

PartialSortingTransform单元:此单元输入的每一份数据都不是有序,此单元内部需要对这份数据进行排序,保证对下游单元输出的是有序的数据块,其中,单个数据块内有序;

MergeSortingTransform单元:此单元输入的每一份数据是数据块内有序,此单元内部需要处理所有输入数据块,对所有的数据块进行整体排序,保证输出的是所有数据块排序之后的有序数据;

BufferingToFileTransform单元:输入数据由MergeSortingTransform单元提供,BufferingToFileTransform单元负责将数据落盘到文件,之后负责这份数据的加载。

MergeSortingTransform单元:内存保存数据容量有一定的阀值限制,当超过这个阀值时,内存的这部分数据需要整体排序,之后借助BufferingToFileTransform单元写入到磁盘;每当超过阀值需要落盘时,BufferingToFileTransform单元会新增一个outputport单元,这个outputport单元会关联一个新创建的BufferingToFileTransform单元;

MergeSortingTransform单元提供的有序数据,BufferingToFileTransform单元会分成多个块,写入到同一个文件。

MergeSortedTransform单元:有多个输入,每个输入的数据是整体有序的,此单元需要对多个有序的输入整体进行排序,保证输出的是整体有序的数据;

通过PartialSortingTransform单元保证每个输入的数据块有序;而所述MergeSortingTransform单元接收多个有序的数据块,存放到自己内部的缓冲区中。

其具体如下工作流程如下:

创建expand单元过程中新增的Transform单元,并将新增的Transform单元之间的关联处理好;进一步的,创建一新的BufferingToFileTransform单元,为其创建一个inputport单元,一个outputport单元;创建一个新的outputport单元,关联新创建BufferingToFileTransform单元的inputport单元;

如果内部的MergeSortedTransform单元没有创建,则创建一个新的MergeSortedTransform单元,为其添加一个outputport单元;MergeSortingTransform新添加一个inputport单元,将内部MergeSortedTransform单元的outputport单元与MergeSortingTransform单元新添加inputport单元建立关联。

进一步的,为内部的MergeSortedTransform单元新创建一个inputport单元,将新创建BufferingToFileTransform单元的outputport与单元MergeSortedTransform单元新创建的inputport单元进行关联;当PipelineExecutor单元内的worker单元调用MergeSortingTransform单元的prepare单元接口时,返回ExpandPipeline单元的状态。

在PipelineExecutor单元内的worker单元发现Transform单元状态为ExpandPipeline时,调用Transform单元的expandPipeline单元的方法;MergeSortingTransform单元的expandPipeline单元方法会返回新创建的Transform单元;PipelineExecutor单元内的worker单元得到这些新添加的Transform单元,会通过这些Transform单元的prepare单元的方法,检测其状态是否为Ready,决定是否需要将其添加到TaskQueue单元中。

MergeSortedTransform单元会从所有的输入取数据,通过归并方式对多个输入进行全局排序,保证输出数据的整体有序。

MergeSortingTransform单元会从最后一个inputport单元中接收数据,写入到第一个outputport单元中,MergeSortedTransform单元单元会从所有的输入(pipeline中的与其相关的多条线)取数据,通过归并方式对多个输入进行全局排序,保证输出数据的整体有序,最终将整体有序的数据输出给下游单元。

上述实施例,可以全部或部分地通过软件、硬件、固件或其他任意组合来实现。当使用软件实现时,上述实施例可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令或计算机程序。在计算机上加载或执行所述计算机指令或计算机程序时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以为通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集合的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质。半导体介质可以是固态硬盘。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种pipeline并行调度执行中的扩展方法航道水下地形变化分析系统及方法逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。

所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(read-onlymemory,ROM)、随机存取存储器(randomaccessmemory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。

最后:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所作的任何修改等同替换、改进等,均应包含在本发明的保护范围之内。

技术分类

06120115637765