一种解决Spark数据倾斜方法及系统与流程

文档序号:11199067阅读:568来源:国知局
一种解决Spark数据倾斜方法及系统与流程

本发明涉及大数据计算领域,特别涉及一种解决spark数据倾斜方法及系统。



背景技术:

apachespark是一个快速高效的集群计算系统。spark很好地利用了hadoop和mesos的基础设施。借hadoop之势与hadoop无缝结合,但是相比于hadoopmapreduce具有更高的计算速度,同时spark支持内存计算、多迭代批量处理、即席查询、流处理和图计算等多种范式。

对spark/hadoop这样的大数据系统来讲,数据量大并不可怕,可怕的是数据倾斜。数据倾斜指的是,并行处理的数据集中,某一部分(如spark或kafka的一个partition)的数据显著多于其它部分,从而使得该部分的处理速度成为整个数据集处理的瓶颈,例如,绝大多数task执行得都非常快,但个别task执行极慢,如,总共有1000个task,997个task都在1分钟之内执行完了,但是剩余两三个task却要一两个小时。

因此,如何解决spark中数据倾斜,成为了难点。



技术实现要素:

有鉴于此,本发明的目的在于提供一种解决spark数据倾斜方法及系统,以解决spark中数据倾斜,提高运行速度。其具体方案如下:

一种解决spark数据倾斜方法,包括:

将超过预设数据量的数据集按照预设分割方法进行分割处理,得到数据块集;

将所述数据块集中的数据块分配给redtask集中满足预设条件的redtask,得到中间结果集;

将中间结果集分配给所述redtask集中的一个redtask中进行汇总处理,得到处理结果。

可选的,所述将超过预设数据量的数据集按照预设分割方法进行分割处理的过程,包括:

将超过所述预设数据量的所述数据集按照预设数据块数据量进行分割处理。

可选的,所述将超过预设数据量的数据集按照预设分割方法进行分割处理的过程,包括:

将超过所述预设数据量的所述数据集按照预设的数据块数量进行分割处理。

可选的,所述将超过预设数据量的数据集按照预设分割方法进行分割处理的过程,包括:

将超过所述预设数据量的所述数据集按照满足所述预设条件的redtask数量进行分割处理。

可选的,所述将所述数据块集中的数据块分配给redtask集中满足预设条件的redtask的过程,包括:

将所述数据块集中的数据块平均分配给redtask集中满足所述预设条件的redtask。

可选的,所述汇总处理的过程,包括:

利用中间结果集中每个中间结果的key,将具有相同key的中间结果进行汇总。

本发明还相应公开了一种解决spark数据倾斜系统,包括:

分割模块,用于将超过预设数据量的数据集按照预设分割方法进行分割处理,得到数据块集;

分配模块,用于将所述数据块集中的数据块分配给redtask集中满足预设条件的redtask,得到中间结果集;

汇总模块,用于将中间结果集分配给所述redtask集中的一个redtask中进行汇总处理,得到处理结果。

可选的,所述分割模块,具体用于将超过所述预设数据量的所述数据集按照预设数据块数据量进行分割处理。

可选的,所述分配模块,具体用于将所述数据块集中的数据块平均分配给redtask集中满足所述预设条件的redtask,得到中间结果集。

可选的,所述汇总模块,具体用于将中间结果集分配给所述redtask集中的一个redtask中,利用中间结果集中每个中间结果的key,将具有相同key的中间结果进行汇总,得到处理结果。

本发明中,解决spark数据倾斜的方法,包括:将超过预设数据量的数据集按照预设分割方法进行分割处理,得到数据块集;将数据块集中的数据块分配给redtask集中满足预设条件的redtask,得到中间结果集;将中间结果集分配给redtask集中的一个redtask中进行汇总处理,得到处理结果。本发明在接收到超过预设数据量的数据集时,将其进行分割处理,得到数据块集,再将数据块集分配给redtask集中的redtask进行并行的计算和处理,从而使多个redtask能对一个大数据量的数据集进行并行运算,加快数据的处理速度,运算完成后,得到中间结果集,再将中间结果分配到一个redtask中进行汇总处理,形成与数据集相应的处理结果,保证了数据和结果的完整性,综上所述,解决了spark中数据倾斜的情况,提高了运行速度。

附图说明

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

图1为现有技术的示意图;

图2为本发明实施例公开的一种解决spark数据倾斜方法流程示意图;

图3为本发明实施例公开的一种解决spark数据倾斜系统结构示意图。

具体实施方式

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

本发明实施例公开了一种解决spark数据倾斜方法,参见图2所示,该方法包括:

本发明实施例的一种解决spark数据倾斜方法,主要应用于spark系统中的shuffle步骤,通过对shuffle中的执行过程进行改进解决spark中的数据倾斜情况。

步骤s11:将超过预设数据量的数据集按照预设分割方法进行分割处理,得到数据块集。

具体的,判断由maptask得到的多个数据集中超过预设数据量的数据集,将超过预设数据量的数据集按照预设分割方法进行分割处理,将超过预设数据量的数据集分割为多个数据块,得到数据块集。

可以理解的是,如果一个数据集数据量过大,将导致后续redtask(reducetask)处理时间极长,因此,本发明实施例将数据量超过预设数据量的数据集进行分割处理,以加快后续的运算速度。

其中,预设数据量可以由用户预先进行设定,当数据集的数据量超过预设数据量,则对该数据集进行分割处理,例如,设定预设数据量为300,接收到3个数据集,3个数据集的数据量分别为100、295和500,前两个数据集数据量低于预设数据量300因此不进行操作,第三个数据集数据量为500超过预设数据量300,触发分割处理操作,将第三个数据集进行分割处理,得到第三个数据集的多个数据块和包括数据块的数据块集。

可以理解的是,可以同时对多个超过预设数据量的数据集按照预设分割方法进行分割处理,并得到数据块集。

步骤s12:将数据块集中的数据块分配给redtask集中满足预设条件的redtask,得到中间结果集。

具体的,分割处理完毕后,将数据块集中的数据块分配给redtask集中满足预设条件的redtask,由redtask再对数据块进行计算和处理,得到中间结果集;数据块集中的多个数据块可以同时分配给redtask集中满足预设条件的多个redtask,同时并行和/或串行的对各自分配到的数据块进行计算和处理,相继得到多个中间结果,从而加快对数据的处理速度。

步骤s13:将中间结果集分配给redtask集中的一个redtask中进行汇总处理,得到处理结果。

具体的,为确保数据集最初的完整性,将中间结果集分配给redtask集中的一个redtask中进行汇总处理,从而得到与数据集相应的处理结果。

可见,本发明实施例在接收到超过预设数据量的数据集时,将其进行分割处理,得到数据块集,再将数据块集分配给redtask集中的redtask进行并行的计算和处理,从而使多个redtask能对一个大数据量的数据集进行并行运算,加快数据的处理速度,运算完成后,得到中间结果集,再将中间结果分配到一个redtask中进行汇总处理,形成与数据集相应的处理结果,保证了数据和结果的完整性,解决了spark中数据倾斜的情况,提高了运行速度。

本发明实施例公开了一种具体的解决spark数据倾斜的方法,相对于上一实施例,本实施例对技术方案作了进一步的说明和优化。具体的:

本发明实施例中,上述步骤s11中将超过预设数据量的数据集按照预设分割方法进行分割处理,得到数据块集的步骤中,预设分割方法可以包括预设的数据块大小、预设的数据块数量和/或满足预设条件的redtask数量等方法对超过预设数据量的数据集进行分割处理。

具体的,当将超过预设数据量的数据集按照预设数据块数据量进行分割处理时,用户预先设定分割后的每个数据块数据量,例如,设定分割后的数据块数据量为100,将超过预设数据量的数据集按照预设数据块数据量,分割为多个数据量相等的数据块,例如,预设数据量为200,预设数据块数据量为100,当前超过预设数据量的数据集数据量大小为550,则将数据集分割为5个数据量为100的数据块,可以理解的是,剩余的50数据量虽然不满足预设数据块数据量100,但仍可以被分割为第六个数据块。

具体的,当将超过预设数据量的数据集按照预设的数据块数量进行分割处理时,用户预先设定分割后的数据块总数,例如,预设数据量为100,设定分割后的数据块数量为5,即将超过预设数据量的数据集分割为5个数据块,当前超过预设数据量的数据集数据量大小为1000,则将数据集分割为5个数据量为200的数据块。

需要说明的是,如果分割后的数据块的数据量仍超过预设数据量,则可以根据用户的设定判断是否继续对超过预设数据量的数据块进行划分,用户可以设定不对数据集分割后产生的超过预设数据量的数据块再次进行划分,例如上例中当前超过预设数据量的数据集数据量大小为1000,则将数据集分割为5个数据量为200的数据块,则不再对5个数据量为200的数据块进行划分,也可以设定将对数据集分割后产生的超过预设数据量的数据块再次进行划分,直至分割后产生的数据块数据量小于等于预设数据量,例如,预设数据量为100,设定分割后的数据块数量为5,当前超过预设数据量的数据集数据量大小为1000,则将数据集分割为5个数据量为200的数据块,由于数据量为200的数据块超过预设数据量100,则将5个数据量为200的数据块分割为25个数据量为40的数据块。

具体的,还可以将超过预设数据量的数据集按照满足预设条件的redtask数量进行分割处理,在进行分割处理前,获取redtask工作状态,计算出满足预设条件的redtask数量,再将超过预设数据量的数据集按照满足预设条件的redtask数量进行分割处理,其中,预设条件可以设定为空闲状态的redtask,即未在处理任何任务的redtask,或者可以设定为待处理任务数小于等于阈值的redtask,例如,设定处理任务述小于2的redtask,共有3个redtask,第一redtask有2个数据块和1个数据集待处理,第二redtask有1个数据集待处理,第三redtask有2个数据块待处理,则第一redtask有3个待处理任务,第二redtask和第三redtask分别有1个待处理任务和2个待处理任务,则第二redtask和第三redtask作为满足预设条件的redtask,满足预设条件的redtask数量为2,将超过预设数据量的数据集分割为2个数据块。

需要说明的是,上述预设分割方法可以根据实际应用需求进行任意组合,而在使用时不只局限于一次使用一种方法,在此不做限定。

本发明实施例中,上述步骤s12中将数据块集中的数据块分配给redtask集中满足预设条件的redtask的过程,还可以包括:

具体的,为了充分发挥并行处理的性能,将数据块集中的数据块平均分配给redtask集中满足预设条件的redtask,使每个满足预设条件的redtask都能同时处理数据块,加快处理速度,其中,预设条件可以为空闲的redtask、待处理任务数小于等于阈值的redtask和/或同一节点中的redtask。

需要说明的是,跨节点获取数据将会引发shuffle操作,而shuffle操作会影响执行效率,为此为避免在汇总时引发shuffle操作,将数据块集中的数据块平均分配给redtask集中同一节点中的redtask。

本发明实施例中,上述步骤s13中汇总处理的具体过程,可以包括利用中间结果集中每个中间结果的key,将具有相同部分key属于同一数据集的中间结果进行汇总。

需要说明的是,每个数据块和数据集都有相应的key,在数据集被分割时,其子数据块将会生成与数据集key相关的对应每个数据块的子key,用于区分每个数据块,同时也保留着与数据集的关系,即使在经过redtask处理后key仍不会改变,因此,可以利用中间结果集中每个中间结果的key,将因为属于同一数据集而具有相同部分的key的中间结果进行汇总,从而得到最终的与数据集相应的处理结果。

例如,超过预设数据量的数据集key为key3,将其分割为第一数据块、第二数据块和第三数据块,数据块相应的key分别为key31、key32和key33,在汇总时,redtask中包括5个中间结果相应的key1、key2、key31、key32和key33,此时,利用每个中间结果的key,可以判断出key31、key32和key33具有相同部分key3,说明属于同一数据集,将key31、key32和key33相对应的中间结果进行汇总处理,得到与数据集相应的处理结果,处理结果的key为key3。

相应的,本发明实施例还公开开了一种解决spark数据倾斜系统,参见图3所示,该系统包括:

分割模块,用于将超过预设数据量的数据集按照预设分割方法进行分割处理,得到数据块集;

分配模块,用于将数据块集中的数据块分配给redtask集中满足预设条件的redtask,得到中间结果集;

汇总模块,用于将中间结果集分配给redtask集中的一个redtask中进行汇总处理,得到处理结果。

可见,本发明实施例在接收到超过预设数据量的数据集时,将其进行分割处理,得到数据块集,再将数据块集分配给redtask集中的redtask进行并行的计算和处理,从而使多个redtask能对一个大数据量的数据集进行并行运算,加快数据的处理速度,运算完成后,得到中间结果集,再将中间结果分配到一个redtask中进行汇总处理,形成与数据集相应的处理结果,保证了数据和结果的完整性,解决了spark中数据倾斜的情况,提高了运行速度。

本发明实施例中,上述分割模块,可以具体用于将超过预设数据量的数据集按照预设数据块数据量进行分割处理。

分割模块,还可以具体用于将超过预设数据量的数据集按照预设的数据块数量进行分割处理。

分割模块,还可以具体用于将超过预设数据量的数据集按照满足预设条件的redtask数量进行分割处理。

需要说明的是,上述分割模块的具体功能可以相互结合,不仅只局限于一次使用一种,在此不做限定。

本发明实施例中,上述分配模块,可以具体用于将数据块集中的数据块平均分配给redtask集中满足预设条件的redtask,得到中间结果集。

本发明实施例中,上述汇总模块,可以具体用于将中间结果集分配给redtask集中的一个redtask中,利用中间结果集中每个中间结果的key,将具有相同key的中间结果进行汇总,得到处理结果。

最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

以上对本发明所提供的一种解决spark数据倾斜方法及系统进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1