一种SQL语义感知的弹性倾斜处理方法及系统与流程

文档序号:24543406发布日期:2021-04-02 10:28阅读:161来源:国知局
本发明涉及数据管理
技术领域
:,并特别涉及一种sql语义感知的弹性倾斜处理方法及系统。
背景技术
::在分布式系统中,任何的分析作业都必须通过平均分配到大量的线程中以达到良好的加速执行效果,而现实工作中平均分配难以实现,因此倾斜(skewness)在所难免。在mapreduce架构中,为了充分利用大量节点的并行计算能力,完成对海量数据的分析与操作,其必要条件是所有分析操作必须在数以万计的线程之间平均分配以达到良好的加速比。而由于大数据分析负载的随机性和用户数据的多样性,以及海量数据通常缺乏足够的统计信息用于了解数据内部的分布规律,因此在mapreduce框架中的倾斜更为普遍且对程序整体执行性能影响重大。倾斜从来源上可分为计算倾斜(computationalskew)和数据分布倾斜(partitionskew)两类。计算倾斜的主要来源是不同数据在运行时所需计算时长不一,而数据分布倾斜的主要原因是传统基于key哈希值的数据划分方式无法感知数据集中key本身的不均,导致数据划分后出现数据量明显大于均值的分片——倾斜分片。倾斜造成的直观后果是执行同类任务的不同作业执行时长不同,从而导致集群中负载分布不均,降低整体计算并行度,导致集群资源的不充分利用甚至应用的崩溃。在相同数据量、相同查询场景下,sparksql在倾斜负载jcc-h的执行时间是未倾斜负载tpc-h的3.24倍。针对倾斜的优化可分为五类,分别是:1、基于额外统计作业的静态划分式倾斜处理技术方案:为了在作业运行时获得对作业倾斜情况更精准的分析,并维持原始数据处理程序执行逻辑不变,这类技术将倾斜的识别与处理分成两个阶段在执行实际作业前运行额外的用于获取统计分析信息的作业;根据得到的统计信息,得到一种"非倾斜"的数据划分方式,然后按照此种固定的数据划分为每个分片启动独立作业进行处理,并期待达到消除倾斜的目的。缺点:1)由于其统计是针对数据量的,因此无法处理计算倾斜;2)额外的统计作业有额外的启动、执行开销。3)一次性得到的划分方式无法针对运行时系统的可用资源实时高效使用,可能造成系统资源的不充分利用。2、基于在map阶段进行数据采样的静态划分式倾斜处理技术方案:在mapreduce框架的开源实现hadoop中,reducer作业默认在map完成5%后开始工作。一些以处理数据分布倾斜为目标的研究为了避免额外统计作业识别引入过大性能开销,采取了在map阶段内部进行key特征收集、进行对key出现频率的估计。这类作业往往通过延迟reduce阶段启动时间的方式,尽可能多的进行采样来达到更加精准的key分步的预测。缺点:1)由于其统计是针对数据量的,因此无法处理计算倾斜;2)一次性得到的划分方式无法针对运行时系统的可用资源实时高效使用,可能造成系统资源的不充分利用。3、基于动态感知的倾斜处理——skewtune技术方案:skewtune提出了在节点算力空闲时每次识别一个倾斜task,并将task未处理数据在多个计算slot间均分的方法处理倾斜。缺点:由于skewtune无法感知倾斜task的语义,因此其只能按照key进行分片的再划分,因此无法处理task中单key倾斜的场景。4、基于聚合算子感知的倾斜处理——aggskew技术方案:aggskew按照分片大小,将处理分片的任务分为segmenttask和stealingtask,segmenttask将大分片细分成确定个数的segment,stealingtask在处理完其分片后,取未完成的segment进行处理。缺点:1)倾斜处理的适用范围局限在聚合算子;2)倾斜处理的最大并行度即segment数与集群可用资源数无关,无法充分利用集群空闲计算资源。5、基于连接算子感知的倾斜处理——spark-adaptive技术方案:spark-adaptive基于广播的思想处理join算子的倾斜——在识别倾斜partition后,spark-adaptive将参与join的一侧partition进行数据的再划分到多task执行,并将另一侧partition以广播形式传送到各倾斜处理的task中,以单侧partition的多次复制开销为代价完成join算子的倾斜处理。缺点:1)处理倾斜的适用范围局限在join算子;2)并行处理join倾斜时不考虑集群可用资源,无法充分利用集群可用资源。技术实现要素:本发明的目的是解决倾斜导致的同类任务的不同作业执行时长不同,从而导致集群中负载分布不均,降低整体计算并行度,导致集群资源的不充分利用甚至应用的崩溃问题,从而提出一种sql语义感知的动态倾斜处理方法,其中sql是ansi发布的结构化查询语言标准,用于查询、访问、操作数据库。。针对现有技术的不足,本发明提出一种sql语义感知的弹性倾斜处理方法,其特征在于,包括:步骤1、根据分布式系统的并行框架的并行度以及待处理作业的程序语义,将待处理作业的完整数据集划分为多个分片,并根据分片大小将分片分配至该分布式系统内的计算节点;步骤2、计算节点为其所分配的分片赋予工作线程,将分片以定长子分片粒度划分,工作线程以定长子分片为粒度处理其被赋予的分片的子分片,并在处理过程中判断计算节点内是否存在未赋予分片或已完成分片处理的空闲线程,若是,则执行步骤3,否则,执行步骤5;步骤3、判断该空闲线程所属计算节点内除该空闲线程以外的其它工作线程中是否存在未处理数据量大于第一预设值的分片,若是,则从所有未处理数据量大于第一预设值的分片中选择一个分片a,让该空闲线程与分片a对应的工作线程协同处理该分片a,否则执行步骤4;步骤4、判断该分布式系统中除该空闲线程所属计算节点外的其余计算节点中是否存在未处理数据量大于第二预设值的分片,若是,则从所有未处理数据量大于第二预计值的分片中选择一个分片b,把该分片b的未处理数据部分切分至该空闲线程所属计算节点,该空闲线程以该定长子分片粒度处理该分片b的部分未处理数据,执行步骤5,否则直接执行步骤5;步骤5、根据该程序语义集合各工作线程的处理结果,作为该待处理作业的完整数据集的最终处理结果。所述的sql语义感知的弹性倾斜处理方法,其特征在于,该并行框架包括:分片划分表和分片到节点的划分器,该分片划分表用于记录分片数据到节点的划分关系,该划分器负责维护该分片划分表,该分片划分表的每个表项为包括pid、eid和psids的三元组,pid是partitionid,用于唯一确定一个分片;eid是executorid,用于唯一确定一个计算节点;psids为包含所有已经被分配的分片文件段。所述的sql语义感知的弹性倾斜处理方法,其特征在于,该步骤4包括:步骤41、该待处理作业的程序语义包括排序sort语义,各个工作线程的处理结果为按键值顺序排序的子分片处理结果,通过找到各子分片处理结果的n-1个局部划分点,将各工作线程的处理结果划分成等长的n个部分,其中n为用于处理当前分片的线程总数;步骤42、将局部划分点进行顺序排序,得到中间排序结果,将该中间排序结果中找到n-1个全局划分点,将中间排序结果划分成等长的n个部分,将该n-1个全局划分点对应的n个键值范围划分给各计算节点,由计算节点触发到其他计算节点键值范围的取数据过程,以最终完成各键值范围的归并排序作为分片的排序结果。所述的sql语义感知的弹性倾斜处理方法,其特征在于,该步骤4包括:步骤43、该待处理作业的程序语义包括聚集aggregate语义,各个工作线程的处理结果为子分片的聚集处理结果,各工作线程分别在内存中维护固定大小的用于记录该聚集处理结果的哈希表,当该分片的数据全部处理完毕时,各工作线程将其哈希表划分成n个哈希片,n为参与该分片处理的工作线程总数;步骤44、按照各计算节点参与处理的工作线程数,将该n个哈希片划分给各个工作线程,由计算节点触发到其他节点哈希片的取数据过程,并由各工作线程最终完成各哈希片的聚合作为分片的聚集结果。所述的sql语义感知的弹性倾斜处理方法,其特征在于,还包括:步骤6、定期将各计算节点涉及的中间计算数据保存至本地磁盘,当分片处理过程中出现错误需要恢复时,判断出现错误的故障计算节点是否可以恢复,若是,则根据该故障计算节点的本地磁盘中该中间计算数据进行故障恢复,否则对该故障计算节点处理的数据进行分片文件的重新计算。本发明还提出了一种sql语义感知的弹性倾斜处理系统,其特征在于,包括:模块1,用于根据分布式系统的并行框架的并行度以及待处理作业的程序语义,将待处理作业的完整数据集划分为多个分片,并根据分片大小将分片分配至该分布式系统内的计算节点;模块2,用于计算节点为其所分配的分片赋予工作线程,将分片以定长子分片粒度划分,工作线程以定长子分片为粒度处理其被赋予的分片的子分片,并在处理过程中判断计算节点内是否存在未赋予分片或已完成分片处理的空闲线程,若是,则调用模块3,否则,调用模块5;模块3,用于判断该空闲线程所属计算节点内除该空闲线程以外的其它工作线程中是否存在未处理数据量大于第一预设值的分片,若是,则从所有未处理数据量大于第一预设值的分片中选择一个分片a,让该空闲线程与分片a对应的工作线程协同处理该分片a,否则调用模块4;从多个未处理数据量大于第一预设值的分片中选择一个分片a的系统,可以是从中选择未处理数据量最大的分片外,或者是从中随机选择一个分片,或者是从中选择第一个大于第一预设值的分片。模块4,用于判断该分布式系统中除该空闲线程所属计算节点外的其余计算节点中是否存在未处理数据量大于第二预设值的分片,若是,则从所有未处理数据量大于第二预计值的分片中选择一个分片b,把该分片b的未处理数据部分切分至该空闲线程所属计算节点,该空闲线程以该定长子分片粒度处理该分片b的部分未处理数据,调用模块5,否则直接调用模块5;模块5,用于根据该程序语义集合各工作线程的处理结果,作为该待处理作业的完整数据集的最终处理结果。所述的sql语义感知的弹性倾斜处理系统,其特征在于,该并行框架包括:分片划分表和分片到节点的划分器,该分片划分表用于记录分片数据到节点的划分关系,该划分器负责维护该分片划分表,该分片划分表的每个表项为包括pid、eid和psids的三元组,pid是partitionid,用于唯一确定一个分片;eid是executorid,用于唯一确定一个计算节点;psids为包含所有已经被分配的分片文件段。所述的sql语义感知的弹性倾斜处理系统,其特征在于,该模块4包括:该待处理作业的程序语义包括排序sort语义,各个工作线程的处理结果为按键值顺序排序的子分片处理结果,通过找到各子分片处理结果的n-1个局部划分点,将各工作线程的处理结果划分成等长的n个部分,其中n为用于处理当前分片的线程总数;将局部划分点进行顺序排序,得到中间排序结果,将该中间排序结果中找到n-1个全局划分点,将中间排序结果划分成等长的n个部分,将该n-1个全局划分点对应的n个键值范围划分给各计算节点,由计算节点触发到其他计算节点键值范围的取数据过程,以最终完成各键值范围的归并排序作为该分片的排序结果。所述的sql语义感知的弹性倾斜处理系统,其特征在于,该模块4包括:该待处理作业的程序语义包括聚集aggregate语义,各个工作线程的处理结果为子分片的聚集处理结果,各工作线程分别在内存中维护固定大小的用于记录该聚集处理结果的哈希表,当该分片的数据全部处理完毕时,各工作线程将其哈希表划分成n个哈希片,n为参与该分片处理的工作线程总数;按照各计算节点参与处理的工作线程数,将该n个哈希片划分给各个工作线程,由计算节点触发到其他节点哈希片的取数据过程,并由各工作线程最终完成各哈希片的聚合作为该分片的聚集结果。所述的sql语义感知的弹性倾斜处理系统,其特征在于,还包括:模块6,用于定期将各计算节点涉及的中间计算数据保存至本地磁盘,当分片处理过程中出现错误需要恢复时,判断出现错误的故障计算节点是否可以恢复,若是,则根据该故障计算节点的本地磁盘中该中间计算数据进行故障恢复,否则对该故障计算节点处理的数据进行分片文件的重新计算。由以上方案可知,本发明提出的mapreduce平台上的sql动态倾斜处理引擎srspark的优点在于:(1)针对mapreduce平台由于倾斜分片而导致处理的并行度下降问题,提出了基于细粒度定长子分片的两级弹性并行处理机制,提高处理倾斜分片的并行度,同时减少子分片之间的同步开销;(2)针对mapreduce平台由于倾斜分片而导致的容错性能降低问题,提出了子分片级检查点机制,实现倾斜负载的快速故障恢复。并且,基于上述两个技术,在sparksql平台上实现了动态倾斜处理引擎srspark。评测结果显示,与sparksql相比srspark在倾斜负载中最大可提升3.57倍执行性能,平均可提升2.23倍执行性能(如附图1所示),在未倾斜负载中srspark性能开销仅为4%(如附图2所示)。附图说明图1为倾斜负载jcc-h的执行性能示意图;图2为未倾斜负载tpc-h的执行性能示意图;图3为本发明执行流程图;图4为本发明架构图;图5为将分片按大小均分到各节点的算法示意图;图6为进程内倾斜分片协同示意图;图7为进程间倾斜分片协同示意图;图8为sort合并流程。具体实施方式本发明包括以下关键点:关键点1:采用基于定长子分片的倾斜分片并行处理机制——将分片以定长子分片粒度划分,工作线程以定长子分片为粒度进行处理;技术效果:各个工作线程负载尽可能均衡,即各线程处理的子分片数量尽量均衡,从而避免倾斜的发生。关键点2:对于每个分片的处理,使用三类线程,并且线程间通过队列进行通信——将一个分片的处理逻辑划分为读取输入数据,处理输入数据和输出结果三步,同时这三步分别使用不同的线程:读线程、工作线程、写线程,线程间基于队列进行通信;技术效果:可以通过增加工作线程数的方式,动态提升倾斜分片的处理并行度。关键点3:采用自适应的倾斜分片两级并行处理策略——空闲工作线程优先"窃取"(workstealing)被预分配到同进程(spark中executor)分片的未处理子分片——进程内并行;当executor整个空闲且作业仍有未完成分片时,在评估窃取加速和协同开销后认为仍有性能优势时,将分片的执行提升为全局执行——进程间并行;技术效果:根据负载自动选择倾斜处理策略,充分利用集群可用资源的同时降低倾斜引入的同步开销。关键点4:采用sql语义感知的结果合并技术——根据不同算子,引入特定的合并流程,保证合并流程语义正确前提下,尽可能对合并过程本身也进行并行处理;技术效果——完成常用sql算子的倾斜分片聚合,使得sql的连接、聚合、排序等算子在倾斜情况下仍能高效并行。关键点5:采用基于检查点机制的快速倾斜分片故障恢复——针对倾斜分片,在处理过程中阶段性进行中间结果的持久化;技术效果:保证在出现倾斜分片执行故障时可以快速恢复,继续正常的执行流程。为让本发明的上述特征和效果能阐述的更明确易懂,下文特举实施例,并配合说明书附图作详细说明如下。为了解决mapreduce框架中基于变长分片执行导致的作业倾斜问题,本发明提出了基于细粒度计算和工作窃取的弹性倾斜处理框架srspark,其解决倾斜的思路为:1.沿用mapreduce的分片粒度,并将分片预划分给节点,尽力保证节点间负载均衡。2.将变长分片划分为多个定长子分片,并以子分片粒度做执行,尽力避免执行粒度上的倾斜出现。3.倾斜分片的自适应并行处理策略:优先进行倾斜分片的进程内并行,其次考虑倾斜分片的进程间并行。4.在倾斜分片并行执行后引入算子感知的合并机制,将倾斜处理的能力扩展到整个sql分析应用。5.对倾斜分片做基于检查点机制的亚分片级容错,提升倾斜处理在故障发生时的执行性能。图3展示了srspark的执行流程,图示的集群有两个节点,每个节点内可用的工作线程为2个。其执行流程如下:1.srspark首先按照原始分布式系统的并行框架spark的程序语义与并行度将完整数据集划分为三个分片(p1、p2、p3),并根据分片大小将分片预分配给两个节点。由于p1远大于p2、p3,因此节点1被分配到了p1一个分片,节点2被分配了p2、p3两个分片。2.进入执行阶段后,由于数据原始只有3个分片,p1被首先赋予了节点1的工作线程1,因此出现节点1工作线程2的暂时空闲,因此节点1向driver请求为工作线程2分配任务;与此同时,节点2的工作线程1被分配处理分片p2,节点2的工作线程2被分配处理分片p3。3.driver在观察了p1的剩余数据量后,命节点1的工作线程2协同处理p1的子分片;与此同时,节点2上的工作线程1继续处理其被分配的分片p2,节点2的工作线程2完成了p3最后一个子分片的处理,因此通过节点2向driver请求为其分配任务。4.driver在考察了分片1、分片2的处理进度后,决定命节点2协同处理分片p1,因此将p1一部分未被读取的文件段分配节点2,节点2上的读线程将文件段切分成子分片,交由其上的工作线程2进行处理;与此同时节点2上的工作线程1继续执行其被分配的分片p2。实例1:srspark在sparksql中的实现为了实现倾斜分片的弹性处理,srspark基于原始spark架构引入了三个额外的模块,如图4所示:1.分片划分表(assignmenttable)和分片到节点的划分器(partitionassigner)——分片划分表记录分片数据到节点的划分关系,划分器负责维护此表。为了表达分片数据到节点的划分关系,同时能表达倾斜分片在进程间的并行,划分表的每个表项是一个(pid,eid,psids)的三元组。pid是partitionid,唯一确定一个分片;eid为executorid,唯一确定一个节点;psids包含所有已经被分配的分片文件段(partitionsplit,ps)。当一个分片首次被分配到一个节点做执行时,划分器在表中记录(pid,eid,all)的三元组(在图4中的assignmenttable第三行(2,3,all)),代表分片的所有文件段均被预分配给节点执行;当需要引入倾斜分片的进程间协作时,划分器确定已经被原始节点处理的分片文件段,替换掉代表全部分配的all项,此后,倾斜分片的多个处理节点根据划分器模块协同读取的分片文件段,保证分片处理的不重不漏(在图4中的assignmenttable第一行(1,1,1、2、3)和第二行(1,2,4、5、6)表示分片1同时被节点1、2处理,其分别分配的分片文件段是1、2、3和4、5、6))。2.倾斜处理协调器(skewcoordinator)和倾斜处理工作模块(skewworker)——当分片作为倾斜分片被识别、其数据由多线程处理时,由于需要考虑多线程结果的协调(例如,对分片的排序在并行情景下需各线程独立排序,而后进行多个局部序的合并),这时skewcoordinator用以处理多线程协调通信。3.检查点协调器(checkpointcoordinator)和检查点工作模块(checkpointworker)——srspark引入了倾斜分片的检查点机制以实现倾斜分片的细粒度容错。checkpointcoordinator在分片被多线程处理时启动,并以可配置的频率触发checkpoint的动作。实例2:数据到工作线程的分配解决倾斜的最基本思想在于提升倾斜分片的处理并行度,使得倾斜分片可由多线程协作处理,从而达到倾斜分片加速处理的目的。因此,srspark对spark原始的分片进行了进一步细分,将分片按照固定粒度切分为定长的子分片(sub-partition),并以子分片的粒度进行数据处理。通过这样的数据划分,多个处理线程可以基于子分片粒度协同处理来自同一倾斜分片的数据,而后srspark会引入额外的合并过程,基于原始的分片处理语义,将多个子分片的结果进行合并。进一步地,对于需要引入合并过程的倾斜分片处理来说,合并过程的开销对倾斜处理的性能起关键性作用。当处理倾斜分片的线程均处于同一进程内部时,合并过程无须引入磁盘和网络开销,只需要依赖进程内的共享数据结构即可完成;而当处理倾斜分片的线程处于不同进程、不同节点时,合并过程本身会引入数据在多进程间shuffle局部处理结果,相比于进程内协作,开销增大。因此,在将分片分配到节点时,要考虑各节点负载的近似均衡,以避免倾斜分片在个别节点的聚集导致合并过程的过大协同开销。另外,于非倾斜分片的处理,我们需要保证其与原始spark的分片处理流程类似,以保证对非倾斜负载/分片的高效处理。基于以上的分析,我们提出了srspark中数据到节点、到工作线程的两点分配原则:平衡各节点的数据负载,尽可能减少数据在节点上的聚集,以减小后续节点间协作的比例。为工作线程优先分配预划分给该节点的未处理分片,在维持各节点数据负载平衡的前提下,尽量减少线程间协同的出现概率。(1)分片到节点的分配为了保证各节点的初始数据负载类似,最大可能减少后续节点间倾斜分片协作的比例。srspark设计了将分片划分到节点的算法4。其基本思想为:根据各分片总的大小计算出节点平均数据量,并采用回溯思想尝试将分片放入表示节点的n个桶中,找到满足桶间数据均衡的一种划分。如图5所示,算法1展示了将分片按大小预分配到n个executor上的方式。算法首先计算出每个executor的平均分片大小(1-2行),并将分片按照大小进行排序(3行),并从最大分片开始启动对一种划分方式的查找(6行)。search方法利用回溯思想,取出当前分片(12行),尝试将依次其放入各个分组(16-29行),若放入某分组成功,则继续下一分片的放置。直至完成所有分片的分组(9-11行)。通过按照分片大小平均分组的方式,完成分片到executor的预划分,从而减少倾斜分片协同过程中过热节点的出现。(2)工作线程获取子分片srspark为工作线程分配分片时遵循最小化协同开销原则:保证节点间负载均衡——优先调度分配给该节点的分片进行处理。保证非倾斜分片无协同开销——当存在未处理分片时,优先调度未处理分片的子分片进行处理。最小化倾斜分片的协同开销——当不存在未处理分片时,优先调度该节点上正在处理分片的子分片进行处理。因此,当srspark有处理能力闲置时,executor向driver发出分片获取申请,在driver的分片划分器(partitionassigner)上,遵循以下的分片分配优先级进行分片分配:本组未处理分片>它组未处理分片>本组进行中分片>它组进行中分片。为了避免倾斜分片在进程间并行时因为分片数据被多个进程重复读取而引入额外的shuffle开销,srspark中reader线程对分片的读是以分片文件段ps为粒度的。每次executor读完被分配到的分片文件段后,再一次性向driver的划分器模块(partitionassigner)申请数个ps,从而保证倾斜分片的高效并行处理。实例3:倾斜分片的进程内协同当工作线程被分配到执行同一节点内的倾斜分片时,executor首先需要将该分片的input子分片队列升权为mpmcq(多生产者多消费者队列)。首先,executor将input子分片队列加锁,使原先的工作线程无法继续从原始队列中获取子分片,随后将当前input子分片队列中的所有子分片加入到一个可由多消费者多生产者共享的队列中。之后通过改变原始reader线程和原始worker线程所使用队列,完成原始读取、工作流程的继续进行。然后由worker线程共同从队列里取子分片进行处理。此时,分片的executor进程内协同如图6所示。多个workerthread协同处理同一个分片的input子分片队列,随着worker空闲线程的增多,参与该分片处理的workerthread数量逐步增加。此时input子分片队列变成了多生产者、多消费者的使用模式,为了最小化此时的协同开销,我们需要采用细粒度锁的方式保证队列操作的原子性——一把队首的锁,协同多个reader向队列中插入子分片,一把队尾锁,协同多个workerthread从队列中读取子分片,由于队列元素的提取频率较低,因此我们还是可以实现多线程协同中较小的同步开销。在进程内协同中,我们采用了mpmcq做子分片队列的实现。实例4:倾斜分片的进程间协同srspark在driver端维护了一张assignmenttable,以ps的粒度将input段分配给不同的executor。图4中的assignmenttable第三行(2,3,all)即代表将partitionid(pid)为2的分片分配给executorid(eid)为3的executor,默认将分片的所有ps全部预分配给executor3(图中用all表示预分配的结果)。为了避免重复shuffle的出现——即分片文件段(ps)已经被exeuctor1上的reader线程读取,但仍未被处理,此时为了倾斜分片均衡又将其分配到了新的节点,如果出现这样的情况,则新executor需要重复读取这个ps的数据,造成shuffle的浪费,srspark在分片进入进程间协作模式后,每次分配3个ps给一个executor,并在driver上维护该分片未处理的psq,通过这样的方式不引入过多协同开销的同时,保证数据读取的不重不漏。因此,新可用的executor首先从driver的psq的上取3个ps,然后将这些ps交由reader线程,最终在本executor的空闲workerthread上协同处理,其协作方式如图7所示。从逻辑上,多个executor的对于同一个分片的多个输入子分片队列组成了一个全局的输入子分片队列。实例5:sql语义感知的合并——sort当一个分片被多个计算节点上的线程协同处理时,需要把各个工作线程的排序结果进行合并后,才能得到该分片的排序结果。sort并行合并的关键在于找到分区范围rangepartition的划分点,并保证各个range上记录数近似相等。sort的并行合并流程如下:1.n个参与倾斜分片执行的线程分别在本地的局部序中找到n-1个划分点,将分片的局部结果按照记录数划分成等长的n个部分。2.将所有n个线程中总共的n*(n-1)传送到driver端,其作为作业的执行流程控制线程位于首先发起该作业的计算节点,在driver中对所有划分点进行顺序排列,并再次在这个序中找到将划分点队列等分为n份的n-1个全局划分点。3.按照各个节点参与倾斜分片协作的线程数,将这n个keyrange划分给各个节点。由节点触发到其他节点keyrange的取数据过程,并最终完成各keyrange的归并排序。sort的并行合并流程如图8所示:每个倾斜处理线程首先利用其可用内存进行局部排序并计算出局部划分点(localseparators),当倾斜分片被完全处理之后,各线程的划分点被汇总到driver中,进行排序并计算全局划分点(globalseparators),并启动一系列合并线程进行全局划分点下各段的并行合并实例6:sql语义感知的合并——aggregate当一个分片被多个计算节点上的线程协同处理时,需要把各个工作线的聚集结果进行合并后,才能得到该分片的聚集结果。aggregate操作的并行、合并流程如下:1.各倾斜处理线程分别在内存中维护固定大小的hashtable(hashtable大小按照线程平均可用cpucache进行设置)。当cpu缓存驻留的hashtable满时,workerthread将hashtable在内存中缓存,并启动新的hashtable进行后续聚合更新。2.当所有数据数据被处理完毕后,driver接到通知,并命令各线程将其上的hashtable都划分成n个hashpartition(n为参与并行aggregate的线程总数)。3.按照各个节点参与倾斜分片协作的线程数,将这n个hashpartition划分给各个线程。由节点触发到其他节点hashpartition的取数据过程,并由各线程最终完成各hashpartition的聚合。实例7:倾斜分片的细粒度容错在srspark中,本发明设计了基于检查点(checkpoint)机制的、亚分片级故障恢复机制。检查点是由driver针对倾斜分片启动的定时任务,在分片第一次被分配做并行执行时,driver启动针对该分片的定时检查点任务,其中任务的调度延迟是用户可配置的时间间隔。并且在一次检查点执行成功后,再次启动对下一次检查点的定时任务。当倾斜分片的参与者收到检查点通知时,将其状态持久化到磁盘,并将完成状态汇报给driver。需要持久化的状态信息与倾斜分片正在进行的处理任务直接相关。例如,对于sort作业,检查点的触发需要工作线程将其内存中缓存的记录进行排序,并将排序结果spill到磁盘,并记录spill文件的信息;对于aggregate作业,检查点的触发需要工作线程将内存内的所有哈希表分别spill到磁盘,并记录spill文件的信息;对倾斜分片处理的参与者,各个组件被通知需要进行checkpoint时需要进行的操作及汇报的状态分别为:driver:记录分片文件段ps到各executor的分配关系。读线程:完成当前子分片的读取,并记录在此文件段中的偏移量。工作线程:继续以子分片为粒度读取输入队列,直至输入队列为空。这时进行其内存状态的持久化,并将持久化的文件信息传递给driver。写线程:将输出队列中的子分片持久化到磁盘,直至输出队列为空。当driver收到所有参与者的完成通知时,则认为此次检查点成功,并可作为故障恢复的重启点。故障恢复当倾斜分片处理过程中出现错误需要恢复时,对应出现故障节点的可用性,srspark采用了两种恢复策略。当节点不可用时,我们默认其持久化的状态信息是不可访问的,因此srspark将分配给该节点的所有分片文件段ps再次放回到未处理的分片文件段队列psq中,从而完成对此节点故障的恢复——即识别出故障节点后,对故障节点处理的数据进行分片文件段级的重计算。当executor进程故障退出时,srspark通过在同节点重启executor进行故障恢复。新启动executor上的skewworker首先从driver的skewcoordinator获取状态文件的位置,并验证状态文件的完整性,若验证成功则表示可以从检查点中进行故障恢复,若失败则需要转入节点不可用的逻辑进行数据重计算。对于状态文件验证成功的情况,worker的读线程从checkpoint中记录的文件段的偏移量位置开始读入数据,工作线程和写线程均不需要进行状态恢复。通过这样的方式,srspark重做了自检查点后,故障发生前所有处理的数据,从而完成了细粒度的故障恢复。以下为与上述方法实施例对应的系统实施例,本实施方式可与上述实施方式互相配合实施。上述实施方式中提到的相关技术细节在本实施方式中依然有效,为了减少重复,这里不再赘述。相应地,本实施方式中提到的相关技术细节也可应用在上述实施方式中。本发明还提出了一种sql语义感知的弹性倾斜处理系统,其特征在于,包括:模块1,用于根据分布式系统的并行框架的并行度以及待处理作业的程序语义,将待处理作业的完整数据集划分为多个分片,并根据分片大小将分片分配至该分布式系统内的计算节点;模块2,用于计算节点为其所分配的分片赋予工作线程,将分片以定长子分片粒度划分,工作线程以定长子分片为粒度处理其被赋予的分片的子分片,并在处理过程中判断计算节点内是否存在未赋予分片或已完成分片处理的空闲线程,若是,则调用模块3,否则,调用模块5;模块3,用于判断该空闲线程所属计算节点内除该空闲线程以外的其它工作线程中是否存在未处理数据量大于第一预设值的分片,若是,则从所有未处理数据量大于第一预设值的分片中选择一个分片a,让该空闲线程与分片a对应的工作线程协同处理该分片a,否则调用模块4;从多个未处理数据量大于第一预设值的分片中选择一个分片a的系统,可以是从中选择未处理数据量最大的分片外,或者是从中随机选择一个分片,或者是从中选择第一个大于第一预设值的分片。模块4,用于判断该分布式系统中除该空闲线程所属计算节点外的其余计算节点中是否存在未处理数据量大于第二预设值的分片,若是,则从所有未处理数据量大于第二预计值的分片中选择一个分片b,把该分片b的未处理数据部分切分至该空闲线程所属计算节点,该空闲线程以该定长子分片粒度处理该分片b的部分未处理数据,调用模块5,否则直接调用模块5;模块5,用于根据该程序语义集合各工作线程的处理结果,作为该待处理作业的完整数据集的最终处理结果。所述的sql语义感知的弹性倾斜处理系统,其特征在于,该并行框架包括:分片划分表和分片到节点的划分器,该分片划分表用于记录分片数据到节点的划分关系,该划分器负责维护该分片划分表,该分片划分表的每个表项为包括pid、eid和psids的三元组,pid是partitionid,用于唯一确定一个分片;eid是executorid,用于唯一确定一个计算节点;psids为包含所有已经被分配的分片文件段。所述的sql语义感知的弹性倾斜处理系统,其特征在于,该模块4包括:该待处理作业的程序语义包括排序sort语义,各个工作线程的处理结果为按键值顺序排序的子分片处理结果,通过找到各子分片处理结果的n-1个局部划分点,将各工作线程的处理结果划分成等长的n个部分,其中n为用于处理当前分片的线程总数;将局部划分点进行顺序排序,得到中间排序结果,将该中间排序结果中找到n-1个全局划分点,将中间排序结果划分成等长的n个部分,将该n-1个全局划分点对应的n个键值范围划分给各计算节点,由计算节点触发到其他计算节点键值范围的取数据过程,以最终完成各键值范围的归并排序作为该分片的排序结果。所述的sql语义感知的弹性倾斜处理系统,其特征在于,该模块4包括:该待处理作业的程序语义包括聚集aggregate语义,各个工作线程的处理结果为子分片的聚集处理结果,各工作线程分别在内存中维护固定大小的用于记录该聚集处理结果的哈希表,当该分片的数据全部处理完毕时,各工作线程将其哈希表划分成n个哈希片,n为参与该分片处理的工作线程总数;按照各计算节点参与处理的工作线程数,将该n个哈希片划分给各个工作线程,由计算节点触发到其他节点哈希片的取数据过程,并由各工作线程最终完成各哈希片的聚合作为该分片的聚集结果。所述的sql语义感知的弹性倾斜处理系统,其特征在于,还包括:模块6,用于定期将各计算节点涉及的中间计算数据保存至本地磁盘,当分片处理过程中出现错误需要恢复时,判断出现错误的故障计算节点是否可以恢复,若是,则根据该故障计算节点的本地磁盘中该中间计算数据进行故障恢复,否则对该故障计算节点处理的数据进行分片文件的重新计算。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1