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

技术领域

本发明实施例涉及计算机技术领域,尤其涉及一种数据倾斜处理方法、设备、存储介质及程序产品。

背景技术

对于分布式集群系统,其不同节点负责一定范围的数据存储或数据计算。通常将数据分散度不够,导致大量的数据集中到一台或者几台服务节点上的情况,称为数据倾斜。以分布式计算引擎Spark为例,Spark计算引擎进行洗牌Shuffle的时候,需要将各个节点上相同的键Key拉取到某个节点上的一个任务task来进行处理,整个Spark作业的运行进度是由运行时间最长的task决定,因此部分Key发生数据倾斜后,会使得Spark的整体计算效率降低。

现有技术中,可以从引擎内核层面,引入自适应查询执行(Adaptive QueryExecution,AQE)技术,AQE针对上述数据倾斜问题使用运行时的统计信息自动优化查询执行,动态的发现倾斜数据的数量,并且把倾斜的分区分成更小的子分区来处理。

然而,实现本发明过程中,发明人发现现有技术中心至少存在如下问题:通过AOE技术进行数据倾斜的优化,依赖于统计信息的准确度,且仅支持部分场景,例如仅支持同一阶段Stage中只有一个链接Join的场景,具有局限性。

发明内容

本发明实施例提供一种数据倾斜处理方法、设备、存储介质及程序产品,以提高数据倾斜处理的全面性和准确性。

第一方面,本发明实施例提供一种数据倾斜处理方法,包括:

通过逻辑执行计划中的查询节点对待连接数据表进行查询,获得数据倾斜的键Key;

根据所述数据倾斜的Key与数据倾斜策略对所述逻辑执行计划进行修改,以使从所述待连接数据表中拆分得到的所述数据倾斜的Key对应的第一待连接子表在分布式计算引擎Spark执行物理执行计划时进行映射端链接Map Join;

根据修改后的所述逻辑执行计划,生成所述物理执行计划,以通过Spark执行所述物理执行计划。

第二方面,本发明实施例提供一种数据倾斜处理设备,包括:

查询模块,用于通过逻辑执行计划中的查询节点对待连接数据表进行查询,获得数据倾斜的键Key;

修改模块,用于根据所述数据倾斜的Key与数据倾斜策略对所述逻辑执行计划进行修改,以使从所述待连接数据表中拆分得到的所述数据倾斜的Key对应的第一待连接子表在分布式计算引擎Spark执行物理执行计划时进行映射端链接Map Join;

生成模块,用于根据修改后的所述逻辑执行计划,生成所述物理执行计划,以通过Spark执行所述物理执行计划。

第三方面,本发明实施例提供一种数据倾斜处理设备,包括:至少一个处理器和存储器;

所述存储器存储计算机执行指令;

所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如上第一方面以及第一方面各种可能的设计所述的方法。

第四方面,本发明实施例提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上第一方面以及第一方面各种可能的设计所述的方法。

第五方面,本发明实施例提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时,实现如上第一方面以及第一方面各种可能的设计所述的方法。

本实施例提供的数据倾斜处理方法、设备、存储介质及程序产品,该方法通过逻辑执行计划中的查询节点对待连接数据表进行查询,获得数据倾斜的键Key,根据所述数据倾斜的Key与数据倾斜策略对所述逻辑执行计划进行修改,以使从所述待连接数据表中拆分得到的所述数据倾斜的Key对应的第一待连接子表在分布式计算引擎Spark执行物理执行计划时进行映射端链接Map Join,根据修改后的所述逻辑执行计划,生成所述物理执行计划,以通过Spark执行所述物理执行计划。本实施例提供的数据倾斜处理方法通过对逻辑执行计划进行修改,使得对倾斜Key的处理从Reduce Join优化成Map Join,从根源上规避了数据倾斜带来的诸多问题,减少了场景限制,避免了对统计信息的依赖,提高了数据倾斜处理的全面性和准确性。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本发明一实施例提供的两个数据表进行链接操作的流程示意图;

图2为现有技术提供的通过散裂化倾斜Key进行链接操作的流程示意图;

图3为本发明一实施例提供的数据倾斜处理方法的流程示意图;

图4为本发明又一实施例提供的数据倾斜处理方法的流程示意图;

图5为本发明又一实施例提供的两个数据表进行链接操作的流程示意图;

图6为现有技术提供的两个数据表进行链接操作的有向无环图;

图7为本发明又一实施例提供的两个数据表进行链接操作的有向无环图;

图8为本发明又一实施例提供的两个数据表进行链接操作的有向无环图;

图9为本发明再一实施例提供的数据倾斜处理方法的流程示意图;

图10为本发明一实施例提供的数据倾斜处理设备的结构示意图;

图11为本发明一实施例提供的数据倾斜处理设备的硬件结构示意图。

具体实施方式

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

对于分布式集群系统,其不同节点负责一定范围的数据存储或数据计算。通常量数据分散度不够,导致大量的数据集中到了一台或者几台服务节点上,称为数据倾斜。

分布式计算引擎Spark进行洗牌Shuffle的时候,需要将各个节点上相同的Key拉取到某个节点上的一个task来进行处理,比如按照Key进行聚合或链接Join等操作。此时如果某个Key对应的数据量特别大的话,就会发生数据倾斜。比如大部分Key对应10条数据,但是个别Key却对应了100万条数据,那么大部分task可能就只会分配到10条数据,然后几秒钟就运行完了;但是个别task可能分配到了100万数据,要运行一两个小时。因此,整个Spark作业的运行进度是由运行时间最长的task决定的。

图1为本发明一实施例提供的两个数据表进行链接操作的流程示意图;如图1所示,表1-1为学生的数学竞赛成绩,第一列数据包括学生证号ID,第二列数据为不同ID分别对应的数学竞赛成绩,表1-2为学生的英语竞赛成绩,第一列数据包括学生证号ID,第二列数据为不同ID分别对应的英语竞赛成绩,从两个表中可以发现,在表1-1中ID为001的学生的成绩条数较多,在两个表进行Join时,每个ID相当于一个Key,显然Key001对应的数据量较大,在对Key001对应的task进行处理时,相对于其他Key需要耗费更多的时间。因此,可以说Key001发生了数据倾斜。当然,此处仅是为了更加形象理解数据倾斜做的示例说明,实际应用中倾斜Key对应的数据量判定条件可以根据需要进行设定。

针对上述数据倾斜的问题,现有技术中,通常采用两种方式进行处理。

一种方式是从应用层进行处理:通过Rand等技术将倾斜的Key进行打散,即将倾斜的Key后面加上随机后缀,将原本倾斜的数据进行散裂化。如图2所示,表1-1和表2-1中的Key001通过Rand技术进行散裂化,可以得到表1-2和表2-1中的Key,001-1,001-2和001-3。散裂化后的表1-2和表2-2依据散裂化后的Key。然而,通过该种方式,一方面会破坏原本的业务逻辑,往往把简单问题复杂化,另一方面,一旦发生拉取失败Fetch Failure进行数据重算时,以图2中的Key001为例,需要重新进行散裂化,上一次散裂得到的001-1,可能在下一次散裂中变成001-5,使得同一条数据被分配到不同的数据分区,最终导致数据重复。

另一种方式是从引擎内核层进行处理:Spark内核引入自适应查询执行技术(Adaptive Query Execution,AQE),AQE针对上述数据倾斜问题使用运行时的统计信息自动优化查询执行,动态的发现倾斜数据的数量,并且把倾斜的分区分成更小的子分区来处理。然而,通过该种方式处理,一方面AQE技术强依赖运行时的统计信息,如果统计信息存在不准确情况会导致数据倾斜误判或遗漏,另一方面,AQE技术仅支持同一个阶段Stage里面只有一个Join的场景,对于多表Join的场景并不支持,并且对于Join后有Shuffle的场景也不会触发AQE数据倾斜的优化逻辑,再一方面,基于AQE处理数据倾斜,本身定位是分区Partition粒度的倾斜治理,如果倾斜数据是同一个Mapper产生的,则无法解决。

由此可见,无论是从应用层进行的优化,还是基于Spark内核引入AQE技术进行的优化,都有其缺陷。针对上述技术问题,发明人研究发现,AQE技术属于对物理执行计划Physical Plan进行的优化,在Spark SQL整个执行计划中,主要包括:逻辑执行计划Logical Plan和物理执行计划Physical Plan,后者是由前者转化得到的,也即如果从逻辑执行计划入手,对数据倾斜进行优化处理,那么可以从根源上解决数据倾斜的问题,避免了从应用层或物理执行计划层面的缺陷。基于此,本发明实施例提供了一种数据倾斜处理方法,通过对逻辑执行计划进行修改,来有效划分数据分片,将倾斜key从Reduce Join优化成Map Join以提升数据处理能力,从根源上规避了数据倾斜带来的诸多问题,减少了场景限制,避免了对统计信息的依赖,提高了数据倾斜处理的全面性和准确性。

下面以具体地实施例对本发明的技术方案进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例不再赘述。

图3为本发明一实施例提供的数据倾斜处理方法的流程示意图。如图3所示,该方法包括:

301、通过逻辑执行计划中的查询节点对待连接数据表进行查询,获得数据倾斜的键Key。

本实施例中,待连接数据表可以至少包括两个数据表,例如,可以包括第一数据表和第二数据表,通过逻辑执行计划中的查询节点可以分别对第一数据表和第二数据表分别进行查询,还可以包括第一数据表、第二数据表和第三数据表等三个以上的数据表,在查询过程中可以依次对第一数据表、第二数据表、第三数据表等进行查询。本实施例对待连接数据表的数量以及查询顺序不做限定。

可选地,在一些实施例中,所述通过逻辑执行计划中的查询节点对待连接数据表进行查询,获得数据倾斜的Key,包括:针对所述待连接数据表的每个Key,将所述Key对应的数据量与第一预设阈值进行对比;若所述Key对应的数据量大于所述第一预设阈值,则将所述Key确定为数据倾斜的Key。

具体的,在通过逻辑执行计划中的查询节点对待连接数据表中的各个数据表进行查询过程中,可以针对每个Key进行查询,如图1所示,假设表1-1和表1-2为待连接数据表,在一种可实现方式中,可以首先对表1-1中的Key001进行查询,再依次查询Key002和Key003等其余Key,再对表2-1中的Key001进行查询,再依次查询Key002和Key003等其余Key。在另一种可实现方式中,可以首先将不同Key对应的条数进行排序,形成新的序列,按照序列中的顺序,从对应条数多到对应条数少,依次对相应的Key进行查询。此种方式有利于尽快找到倾斜的Key,且如果条数少到一定程度,不足以成为倾斜Key的时候,可以及时中止查询,节省运算量。对于具体采用何种查询方式,可根据实际需要确定,本实施例对此不进行限定。

在对每个Key进行查询过程中,可以将该Key对应的数据量与第一预设阈值进行比较。该Key对应的数据量大于第一预设阈值时,将该Key确定为倾斜的Key。此处的数据量可以为数据的容量的大小,例如多少兆、多少G,还可以为条数。第一预设阈值可以是根据经验确定的一个固定值。

302、根据所述数据倾斜的Key与数据倾斜策略对所述逻辑执行计划进行修改,以使从所述待连接数据表中拆分得到的所述数据倾斜的Key对应的第一待连接子表在分布式计算引擎Spark执行物理执行计划时进行映射端链接Map Join。

本实施例中,通过基于数据倾斜Key和数据倾斜策略对逻辑执行计划进行修改,使得从待连接数据表中拆分得到的数据倾斜Key对应的第一待连接字表在后续的物理执行计划被Spark计算引擎执行时能够进行映射端连接。

映射端链接Map Join和归并端链接Reduce Join均是为了将待连接数据表进行Join操作。也即,不同数据源数据的合并操作。其中,Reduce Join是在Map阶段完成数据的标记,在Reduce阶段完成数据的合并。Map Join是直接在Map阶段完成数据的合并,没有Reduce阶段。

具体的,如图1所示的表1-1和表2-1,以此为例,对Reduce Join过程示例说明,在Reduce Join的Map阶段,会将输入数据统一封装为一个Bean,此Bean包含了表1-1和表2-1的所有公共和非公共属性,相当于进行了全外连接,并新增加一个属性,文件名称,以区分数据是来自于表1-1还是表2-1,便于在Reduce阶段数据的处理;Map输出的Key是学生证号ID,Value是Bean。在Shuffle阶段,根据ID对Bean进行排序,所有ID相同的数据都会被聚合到同一个key下,发往同一个Reduce task;在Reduce过程中,对同一个ID下所有的Bean,首先要区分出来源,是表1-1还是表2-1。而如果对表1-1和表2-1进行Map Join的话,没有Reduce过程,所有的工作都在Map阶段完成,极大减少了网络传输和输入输出的代价。具体实现过程中:可以将表1-1或表2-1,例如将表2-1预先缓存于各个Map task节点,然后等到表1-1的数据传输过来时,直接用表1-1的数据连接已经预存的表2-1的数据并输出即可。

本实施例中,以图1中的表1-1和表2-1为例,数据倾斜的Key为001的话,那么该第一待连接子表,包括来自于表1-1的001对应的第一子数据表,来自于表2-1的001对应的第二子数据表。所述从所述待连接数据表中拆分得到的所述数据倾斜的Key对应的第一待连接子表在分布式计算引擎Spark执行物理执行计划时进行映射端链接Map Join,可以是在Sark执行物理执行计划时,将第一子数据表和第二子数据表进行Map Join,具体的,可以将第一子数据表或第二子数据表,例如将第二子数据表预先缓存于各个Map task节点,然后等到第一子数据表的数据传输过来时,直接用第一子数据表的数据连接已经预存的第二子数据表的数据并输出即可。

303、根据修改后的所述逻辑执行计划,生成所述物理执行计划,以通过Spark执行所述物理执行计划。

本实施例中,Spark对代码中API的执行主要包括以下步骤:首先编写DataFrame/Dataset/SQL代码;其次,如果编写的代码没有错误,Spark会将这些代码转换成逻辑执行计划;再次,Spark会将生成的逻辑执行计划进行一系列优化后,将优化后的逻辑执行计划转换为物理执行计划;最后,Spark执行该物理执行计划,也即在集群上对弹性分布式数据集(Resilient Distributed Datasets,RDD)进行一系列操作。

本实施例中,在对逻辑执行计划根据数据倾斜的Key和数据倾斜策略修改完成后,可以基于该修改后的逻辑执行计划生成物理执行计划。当然,待修改的逻辑执行计划可以是优化后的逻辑执行计划,或者是优化前的逻辑执行计划,本实施例对此不进行限定。

本实施例提供的数据倾斜处理方法,通过逻辑执行计划中的查询节点对待连接数据表进行查询,获得数据倾斜的键Key,根据所述数据倾斜的Key与数据倾斜策略对所述逻辑执行计划进行修改,以使从所述待连接数据表中拆分得到的所述数据倾斜的Key对应的第一待连接子表在分布式计算引擎Spark执行物理执行计划时进行映射端链接Map Join,根据修改后的所述逻辑执行计划,生成所述物理执行计划,以通过Spark执行所述物理执行计划。本实施例提供的数据倾斜处理方法通过对逻辑执行计划进行修改,使得对倾斜Key的处理从Reduce Join优化成Map Join,从根源上规避了数据倾斜带来的诸多问题,减少了场景限制,避免了对统计信息的依赖,提高了数据倾斜处理的全面性和准确性。

图4为本发明又一实施例提供的数据倾斜处理方法的流程示意图。如图4所示,在上述实施例的基础上,例如在图3所示实施例的基础上,本实施例中对如何对逻辑修改计划进行修改进行了详细说明,该方法包括:

401、通过逻辑执行计划中的查询节点对待连接数据表进行查询,获得数据倾斜的键Key。

本实施例中,步骤401与上述实施例中步骤301相类似,此处不再赘述。

402、在所述逻辑执行计划中增加根据所述数据倾斜的Key,将所述待连接数据表的数据进行拆分,得到所述第一待连接子表和数据非倾斜的Key对应的第二待连接子表的处理步骤,以使从所述待连接数据表中拆分得到的所述数据倾斜的Key对应的第一待连接子表在分布式计算引擎Spark执行物理执行计划时进行映射端链接Map Join。

403、在所述逻辑执行计划中增加将连接后的所述第一待连接子表和连接后的所述第二待连接子表进行合并,得到最终的数据表的处理步骤,得到修改后的所述逻辑执行计划。

在一些实施例中,所述待连接数据表包括第一数据表和第二数据表,所述数据倾斜的Key来自于所述第一数据表和/或所述第二数据表。也就是说,待连接数据表中的任何一个数据表都有可能被判定存在数据倾斜的Key。如图1所示,两个数据表中只有一个数据表存在数据倾斜的Key,即表1-1中的Key001。而如图5所示,两个数据表中均存在数据倾斜的Key,即表1-1中数据倾斜的Key是001,表4-1中数据倾斜的Key是003。本实施例中对数据倾斜的Key的来源以及数量不做限定。

为了更加形象的对本实施例中的对逻辑执行计划的修改操作,以下结合图5对待连接数据表表1-1和表4-1的连接过程进行示例说明。

如图5所示,表1-1中的数据倾斜的Key是001,表4-1中的数据倾斜的Key是003。因此,在对表1-1进行拆分后,得到包括数据倾斜Key001和003对应数据的表1-1-1,和包括数据非倾斜Key002的表1-1-2;在对表4-1进行拆分后,得到包括数据倾斜Key001和003对应数据的表4-1-1,和包括数据非倾斜Key002的表4-1-2,也就是说,在对待连接数据表表1-1和表4-1根据数据倾斜的Key进行拆分后,得到表1-1-1和表4-1-1组成的第一待连接子表,以及由表1-1-2和表4-1-2组成的第二待连接子表。图5中的表1-1和表4-1仅为示例说明,为了讲述数据表连接过程仅展示了001至003,3个Key。在实际的数据表中,Key的数据量可以达到万数计或千万级别,也就是说,数据非倾斜的Key会很多,数据倾斜Key的占比会非常小,在此情况下,第一待连接子表中的表1-1-1和表4-1-1均作为小表在Spark执行物理执行计划时可以被执行Map Join,而第二待连接子表中的表1-1-2和表4-1-2均作为大表在Spark执行物理执行计划时可以被执行Reduce Join。Map Join和Reduce Join的实现过程可以参照步骤302的描述,此处不再赘述。

第一待连接子表表1-1-1和表4-1-1进行Map Join后,得到表5-1,第二待连接子表表1-1-2和表4-1-2进行Reduce Join后,得到表5-2,表5-1和表5-2进行合并后,得到最终的数据表表5。在一些实施例中,所述将连接后的所述第一待连接子表和连接后的所述第二待连接子表进行合并,包括:通过Union算子,将连接后的所述第一待连接子表和连接后的所述第二待连接子表进行合并,得到最终的数据表。

在一些实施例中,所述第二待连接子表Spark执行物理执行计划时进行归并端链接Reduce Join。可选地,所述Map Join为广播表链接BroadcastHashJoin,所述ReduceJoin为排序合并链接SortMergeJoin。

实际应用中,第一待连接子表的Map Join的方式有多种,以下结合图7至图8对本实施例中对逻辑执行计划进行修改后,第一待连接子表在Spark执行物理执行计划时进行Map Join的方式进行示例说明,并且结合图6,对采用本实施例提供的数据倾斜处理方法前后的优势对比进行说明。

为了保证数据倾斜的Key对应的第一待连接子表均能实现Map Join,在一些实施例中,所述数据倾斜的Key为多个,所述第一待连接子表为多个,所述数据倾斜的Key与所述第一待连接子表一一对应;所述从所述待连接数据表中拆分得到的所述数据倾斜的Key对应的第一待连接子表在Spark执行物理执行计划时进行Map Join,包括:针对每个数据倾斜的Key,所述数据倾斜的Key对应的第一待连接子表在Spark执行物理执行计划时进行MapJoin。如图8所示,以图5中待连接数据表表1-1-1和表4-1-1包括两个数据倾斜Key为例,每个数据倾斜的Key对应一个第一待连接子表,即在对表1-1进行拆分时,可以拆分得到两个第一待连接子表,第一个第一待连接子表仅包括Key001的数据,而另一个待连接子表仅包括Key002的数据。在后续的Map Join过程中,如图8所示,Stage1和Stage2针对一个第一待连接子表,Stage3和Stage4针对另一个第一待连接子表,具体的,均通过BroadcastHashJoin实现数据倾斜的Key的Map Join。而在图8所示的有向无环图中Stage5和Stage6则是针对第二待连接子表,在经过Stage5和Stage6的处理后,通过SortMergeJoin实现数据非倾斜的Key的Reduce Join。在Stage7中,将执行了BroadcastHashJoin的两个第一待连接子表和一个执行了SortMergeJoin的第二待连接子表进行合并Union,得到最终的数据表。

为了能够减少合并操作的计算量,且减少用于处理第一待连接子表的计算节点的数量,在一些实施例中,所述数据倾斜的Key为多个,所述第一待连接子表为至少一个;所述根据所述数据倾斜的Key与数据倾斜策略对所述逻辑执行计划进行修改,还包括:将所述数据倾斜的Key进行分组,得到多个分组;每个分组的总数据量小于第二预设阈值;每个分组对应一个所述第一待连接子表;所述从所述待连接数据表中拆分得到的所述数据倾斜的Key对应的第一待连接子表在Spark执行物理执行计划时进行Map Join,包括:针对每个分组,所述分组对应的第一待连接子表在Spark执行物理执行计划时进行Map Join。以图5中待连接数据表表1-1-1和表4-1-1包括两个数据倾斜Key为例,可以将数据倾斜的Key001和003基于第二预设阈值进行分组,例如,假设001和003对应的数据量的总和小于第二预设阈值,则可以将001和003如图5中所示分到一个分组,而且待连接数据表有且仅有这一个分组。如图7所示,针对该一个分组,可以得到一个第一待连接子表,针对该一个待连接子表,可以通过执行Stage1和Stage2的处理后,进行BroadcastHashJoin来实现第一待连接子表的Map Join。而在图7所示的有向无环图中Stage3和Stage4则是针对第二待连接子表,在经过Stage3和Stage4的处理后,通过SortMergeJoin实现数据非倾斜的Key的Reduce Join。在Stage5中,将执行了BroadcastHashJoin的第一待连接子表和执行了SortMergeJoin的第二待连接子表进行合并Union,得到最终的数据表。本实施例中,第二预设阈值的设定可以根据经验进行设定,本实施例对此不做限定。

可以理解,如果待连接数据表中的数据倾斜的Key有多个,例如100个,则可以通过多种方式,将这100个数据倾斜的Key基于第二预设阈值进行分组。在一种可实现方式中,可以将数据倾斜的Key按照Key的编号数值进行排序,然后针对排序中的第一个Key的数据量基于第二预设阈值进行判断,若小于第二预设阈值,则将第一个和第二个Key的数据总量基于第二预设阈值进行判断,若仍小于第二预设阈值,则将第一个、第二个和第三个Key的数据总量基于第二预设阈值进行判断,直至超过第二预设阈值,则将第N-1个之前的Key划入一个分组内,从第N个开始继续进行上述步骤的判断。直至遍历排序中的所有Key。在另一种可实现方式中,可以将数据倾斜的Key按照每个Key对应的数据量进行排序。然后再基于第二预设阈值对排序中的Key进行分组。本实施例中对此不进行限定,可根据实际需要进行选择。

图6为现有技术中提供的两个数据表进行链接操作的有向无环图。图7为本发明又一实施例提供的两个数据表进行链接操作的有向无环图。图8为本发明又一实施例提供的两个数据表进行链接操作的有向无环图。如图6所示,阶段1Stage1和阶段2Stage2均依次包括以下步骤:范围Range、投影Project、交换Exchange、自定义读取CustomShuffleReader和排序Sort;阶段3Stage3包括排序合并链接SortMergeJoin。如图7所示,阶段1Stage1包括以下步骤:范围Range、过滤Filter、投影Project、交换Exchange、自定义读取CustomShuffleReader和广播交换BroadcastExchage;阶段2Stage2包括以下步骤:范围Range、过滤Filter、投影Project、交换Exchange、自定义读取CustomShuffleReader;阶段3Stage3和阶段4Stage4均包括范围Range、过滤Filter、投影Project、交换Exchange、自定义读取CustomShuffleReader和排序Sort;阶段5包括以下步骤:广播表链接BroadcastHashJoin、排序合并链接SortMergeJoin、合并Union和自适应Spark执行计划AdaptiveSparkPlan。

下面还是以图5所示的表1-1和表4-1为例对图6至图8进行示例说明,如图6所示,两个数据表进行链接,通常是对表1-1通过Stage1的处理,对表4-1通过Stage2的处理后,在Stage3进行SortMergeJoin实现Reduce Join。如图7所示,对表1-1-2进行Stage3的处理,对表4-1-1进行Stage4的处理后,进行Stage5中SortMergeJoin实现ReduceJoin,得到表5-2,对表1-1-1和表4-1-2中其中一个表进行Stage1的处理,对另一个表进行Stage2的处理后,进行Stage5中的BroadcastHashJoin实现MapReduce,得到表5-1,最后将表5-1和表5-2进行Union后,进行自适应Spark执行计划的执行。图8相对于图7来说是将数据倾斜的数据拆分为了多组子表,也即在数据倾斜Key数量太多的情况下将表1-1-1再进行细化拆分后得到多个下一级子表,相对应对表4-1-2也拆分得到多个下一级子表,然后针对每组下一级子表(包括表1-1-1的一个下一级子表,以及该下一级子表对应的表4-1-2的下一级子表),进行Stage1和Stage2的处理后进行BroadcastHashJoin实现多个MapJoin。最终通过Stage7的处理将多个BroadcastHashJoin得到的表和SortMergeJoin得到的表进行合并后,进行自适应Spark执行计划的执行。

采用本发明实施例之前,即优化前如图6所示处理方式中,Spark任务运行时间是5.5分钟,采用本发明实施例之后,即优化后如图7或图8所示处理方式中,Spark任务运行时间是2.1分钟,整体性能提升60%。

404、根据修改后的所述逻辑执行计划,生成所述物理执行计划,以通过Spark执行所述物理执行计划。

本实施例中步骤404与上述实施例中步骤303相类似,此处不再赘述。

本发明实施例提供的数据倾斜处理方法,通过对逻辑执行计划进行修改,对数据倾斜的Key和非数据倾斜的Key进行拆分,使得Spark在执行物理执行计划时,能够使数据倾斜的Key对应的第一待连接子表进行Map Join,大大减少了运行时间。避免了数据倾斜的Key运行时间过长影响整个Spark任务的运行效率。并且该方式没有场景限制,从根源上解决了数据倾斜的问题。

图9为本发明再一实施例提供的数据倾斜处理方法的流程示意图。如图9所示,在上述实施例的基础上,例如在图3所示实施例的基础上,本实施例中对逻辑执行计划的生成过程,以及由修改后的逻辑执行计划生成物理执行计划的过程进行了详细说明。该方法包括:

901、将结构化查询语言SQL文本解析成语法树,生成未解析逻辑执行计划。

902、对所述未解析逻辑执行计划进行解析,得到逻辑执行计划。

903、在所述逻辑执行计划中加入所述查询节点。

本实施例中,逻辑执行计划主要是一系列抽象的转换过程。并不涉及执行器或驱动器,他只是将用户的表达式集合转换为最优的版本。具体的,用户的代码首先会被转换成未解析逻辑执行计划(Unresolved Logical Plan),未解析逻辑计划之所以被称为未解析的,是因为未解析逻辑执行计划并一定是正确的,未解析逻辑执行计划所引用到的表名或者列名可能存在,也可能不存在。Spark之后会使用目录Catalog,一个含有所有数据表table和数据框架DataFrame的元数据仓库,在解析器(Analyser)中来解析校对所引用的表名或者列名。假如未解析逻辑执行计划通过了验证,则可以得到逻辑执行计划(ResolvedLogical Plan)。在逻辑执行计划中增加查询节点(Query Node),以通过该查询节点来对待连接数据表进行查询。

904、通过逻辑执行计划中的查询节点对待连接数据表进行查询,获得数据倾斜的键Key。

905、根据所述数据倾斜的Key与数据倾斜策略对所述逻辑执行计划进行修改,以使从所述待连接数据表中拆分得到的所述数据倾斜的Key对应的第一待连接子表在分布式计算引擎Spark执行物理执行计划时进行映射端链接Map Join。

本实施例中步骤904和步骤905与上述实施例中步骤301和步骤302相类似,此处不再赘述。

906、对修改后的所述逻辑执行计划进行更新,得到更新后的逻辑执行计划。

907、对所述更新后的逻辑执行计划进行优化,得到优化后的逻辑执行计划。

908、将所述优化后的逻辑执行计划转换为物理执行计划。

具体的,逻辑执行计划修改后,需要进行更新,以便后续步骤应用该更新后的逻辑执行计划。将修改后的逻辑执行计划传递到优化器Catalyst Optimizer进行优化,然后被经过一些列优化生成优化后的逻辑执行计划。Spark将此逻辑执行计划转化为一个物理执行计划,检查可行的优化策略,并在此过程中检查优化。物理执行计划通过生成不同的物理执行操作,并通过代价模型进行比较分析,从而确定如何在集群上执行逻辑计划。Spark在选择一个物理计划时,Spark将所有代码运行在Spark的底层编程接口RDD上。Spark在运行时执行进一步优化,生成可以在执行期间优化任务或阶段的本地Java字节码,最终将结果返回给用户。

本发明实施例提供的数据倾斜处理方法,通过在逻辑执行计划优化前加入查询节点,并将查询到的数据倾斜的Key,与数据非倾斜的Key进行拆分,使得Spark在执行物理执行计划时,能够将拆分得到的数据倾斜的Key对应第一待连接子表进行Map Join,从而能够大大节省运行时间。从根源上规避了数据倾斜带来的诸多问题,减少了场景限制,避免了对统计信息的依赖,提高了数据倾斜处理的全面性和准确性。

图10为本发明一实施例提供的数据倾斜处理设备的结构示意图。如图10所示,该数据倾斜处理设备100包括:查询模块1001、修改模块1002以及生成模块1003。

查询模块1001,用于通过逻辑执行计划中的查询节点对待连接数据表进行查询,获得数据倾斜的键Key。

修改模块1002,用于根据所述数据倾斜的Key与数据倾斜策略对所述逻辑执行计划进行修改,以使从所述待连接数据表中拆分得到的所述数据倾斜的Key对应的第一待连接子表在分布式计算引擎Spark执行物理执行计划时进行映射端链接Map Join。

生成模块1003,用于根据修改后的所述逻辑执行计划,生成所述物理执行计划,以通过Spark执行所述物理执行计划。

本发明实施例提供的数据倾斜处理设备,

在一种可能的设计中,所述查询模块具体用于:

针对所述待连接数据表的每个Key,将所述Key对应的数据量与第一预设阈值进行对比。

若所述Key对应的数据量大于所述第一预设阈值,则将所述Key确定为数据倾斜的Key。

在一种可能的设计中,所述修改模块具体用于:

在所述逻辑执行计划中增加以下处理步骤:

根据所述数据倾斜的Key,将所述待连接数据表的数据进行拆分,得到所述第一待连接子表和数据非倾斜的Key对应的第二待连接子表。

将连接后的所述第一待连接子表和连接后的所述第二待连接子表进行合并,得到最终的数据表。

在一种可能的设计中,所述修改模块具体用于:

通过Union算子,将连接后的所述第一待连接子表和连接后的所述第二待连接子表进行合并,得到最终的数据表。

在一种可能的设计中,所述待连接数据表包括第一数据表和第二数据表,所述数据倾斜的Key来自于所述第一数据表和/或所述第二数据表。

在一种可能的设计中,所述数据倾斜的Key为多个,所述第一待连接子表为多个,所述数据倾斜的Key与所述第一待连接子表一一对应;所述修改模块具体用于:针对每个数据倾斜的Key,所述数据倾斜的Key对应的第一待连接子表在Spark执行物理执行计划时进行Map Join。

在一种可能的设计中,所述数据倾斜的Key为多个,所述第一待连接子表为至少一个;所述修改模块还用于:

所述数据倾斜的Key为多个,所述第一待连接子表为至少一个。

针对每个分组,所述分组对应的第一待连接子表在Spark执行物理执行计划时进行Map Join。

在一种可能的设计中,所述设备,还包括:

语法分析模块,用于将结构化查询语言SQL文本解析成语法树,生成未解析逻辑执行计划。

解析模块,用于对所述未解析逻辑执行计划进行解析,得到逻辑执行计划。

创建模块,用于在所述逻辑执行计划中加入所述查询节点。

在一种可能的设计中,所述生成模块具体用于:

对修改后的所述逻辑执行计划进行更新,得到更新后的逻辑执行计划。

对所述更新后的逻辑执行计划进行优化,得到优化后的逻辑执行计划。

将所述优化后的逻辑执行计划转换为物理执行计划。

在一种可能的设计中,所述第二待连接子表Spark执行物理执行计划时进行归并端链接Reduce Join。

在一种可能的设计中,所述Map Join为广播表链接BroadcastHashJoin,所述Reduce Join为排序合并链接SortMergeJoin。

本发明实施例提供的数据倾斜处理设备,可用于执行上述的方法实施例,其实现原理和技术效果类似,本实施例此处不再赘述。

图11为本发明一实施例提供的数据倾斜处理设备的硬件结构示意图,该设备可以是计算机,数字广播终端,消息收发设备,游戏控制台,平板设备,医疗设备,健身设备,个人数字助理等。

设备110可以包括以下一个或多个组件:处理组件1101,存储器1102,电源组件1103,输入/输出(I/O)接口1104,以及通信组件1106。

处理组件1101通常控制设备110的整体操作,诸如与显示,电话呼叫,数据通信,相机操作和记录操作相关联的操作。处理组件1101可以包括一个或多个处理器1105来执行指令,以完成上述的方法的全部或部分步骤。此外,处理组件1101可以包括一个或多个模块,便于处理组件1101和其他组件之间的交互。例如,处理组件1101可以包括多媒体模块,以方便多媒体组件808和处理组件1101之间的交互。

存储器1102被配置为存储各种类型的数据以支持在设备110的操作。这些数据的示例包括用于在设备110上操作的任何应用程序或方法的指令,联系人数据,电话簿数据,消息,图片,视频等。存储器1102可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。

电源组件1103为设备110的各种组件提供电力。电源组件1103可以包括电源管理系统,一个或多个电源,及其他与为设备110生成、管理和分配电力相关联的组件。

I/O接口1104为处理组件1101和外围接口模块之间提供接口,上述外围接口模块可以是键盘,点击轮,按钮等。这些按钮可包括但不限于:主页按钮、音量按钮、启动按钮和锁定按钮。

通信组件1106被配置为便于设备110和其他设备之间有线或无线方式的通信。设备110可以接入基于通信标准的无线网络,如WiFi,2G或3G,或它们的组合。在一个示例性实施例中,通信组件1106经由广播信道接收来自外部广播管理系统的广播信号或广播相关信息。在一个示例性实施例中,所述通信组件1106还包括近场通信(NFC)模块,以促进短程通信。例如,在NFC模块可基于射频识别(RFID)技术,红外数据协会(IrDA)技术,超宽带(UWB)技术,蓝牙(BT)技术和其他技术来实现。

在示例性实施例中,设备110可以被一个或多个应用专用集成电路(ASIC)、数字信号处理器(DSP)、数字信号处理设备(DSPD)、可编程逻辑器件(PLD)、现场可编程门阵列(FPGA)、控制器、微控制器、微处理器或其他电子元件实现,用于执行上述方法。

本申请还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上数据倾斜处理设备执行的数据倾斜处理方法。

上述的计算机可读存储介质,上述可读存储介质可以是由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。可读存储介质可以是通用或专用计算机能够存取的任何可用介质。

一种示例性的可读存储介质耦合至处理器,从而使处理器能够从该可读存储介质读取信息,且可向该可读存储介质写入信息。当然,可读存储介质也可以是处理器的组成部分。处理器和可读存储介质可以位于专用集成电路(Application Specific IntegratedCircuits,简称:ASIC)中。当然,处理器和可读存储介质也可以作为分立组件存在于设备中。

本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。

本发明实施例还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时,实现如上数据倾斜处理设备执行的数据倾斜处理方法。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

相关技术
  • 数据倾斜处理方法、设备、存储介质及程序产品
  • 数据倾斜处理方法、装置、电子设备及可读存储介质
技术分类

06120113807898