一种用于在Spark环境中实现分区负载均衡的方法和系统与流程

文档序号:20264587发布日期:2020-04-03 18:13阅读:218来源:国知局
一种用于在Spark环境中实现分区负载均衡的方法和系统与流程

本发明属于大数据、分布式并行计算领域,涉及一种用于在spark环境中实现分区负载均衡的方法和系统。



背景技术:

随着互联网的高速发展,人们的日常行为会产生大量的数据,数据总量和数据增长率日渐攀升,对于日益庞大的数据而言,单机计算已经无法满足需求,mapreduce编程模型应运而生。mapreduce是一个以可靠、容错的方式并行处理海量数据的软件框架,apachespark是基于mapreduce模型的一种大规模数据快速通用处理引擎,apachespark在批处理和流处理上都能够达到很高的性能,它是一个包含有状态的有向无环图调度器和查询优化器的物理执行引擎,相比于hadoop,spark支持内存计算,提供交互式查询,并对迭代工作负载进行了优化,能够更加高效地对大规模数据进行处理。正如之前的许多研究中所展示的,spark中的数据处理引擎(如shark和spark-sql)在内存中的处理速度比hadoopmapreduce快一百多倍。

现有spark环境下的分区方法主要采用基于哈希(hash)的分区方法,其通过对数据中键值对的键取模的方式获得分区号,并适用于大部分非排序算子。

然而,上述基于哈希的分区方法存在不可忽略的缺陷:对于现实场景的数据而言,键的分布往往并不是均匀的,往往会出现数据倾斜,在经过哈希计算分区号后,各分区指向的数据量大小不一致,这会导致多个任务的大小和执行时间不相等,当短任务完成时,长任务还没有完成,那么短任务也必须等待长任务的完成,从而会延长整个spark应用程序的处理时间。



技术实现要素:

针对现有技术的以上缺陷或改进需求,本发明提供了一种用于在spark环境中实现分区负载均衡的方法和系统,其目的在于,解决现有基于哈希的分区方法在出现数据倾斜时,整个spark应用程序的处理时间过长的技术问题。

为实现上述目的,按照本发明的一个方面,提供了一种用于在spark环境中实现分区负载均衡的方法,包括以下步骤:

(1)接收用户发送的spark应用程序,对该spark应用程序进行解析,以得到表征多个弹性分布式数据集rdd之间关系的rdd图、以及调度阶段的有向无环图dag;

(2)根据步骤(1)得到的dag图依次确定每两个相邻调度阶段之间的依赖关系,并对得到的所有依赖关系中的宽依赖关系进行编号;

(3)设置计数器cnt=1;

(4)判断cnt是否大于宽依赖关系的总数,如果是则过程结束,否则转入步骤(5);

(5)对第cnt个宽依赖关系对应的map端(其作为当前map端)中最后一个rdd中的所有分区中的数据进行采样,以得到表征数据键分布的、每个分区对应的哈希表;

(6)将步骤(5)得到的所有分区对应的哈希表进行合并,从而得到合并后的哈希表thash,将合并后的哈希表thash中的每个值均除以采样率,以得到更新后的哈希表;

(7)根据步骤(6)更新后的哈希表生成键值对形式的重分区策略表;

(8)设置计数器cnt=cnt+1,并返回步骤(4)。

优选地,如果前一个调度阶段中的至少一个分区和后一个调度阶段中的至少一个分区之间是一对一或多对一的映射关系,则这两个调度阶段之间的依赖关系是窄依赖关系;如果前一个调度阶段中的至少一个分区和后一个调度阶段中的至少一个分区之间是一对多或多对多的映射关系,则这两个调度阶段之间的依赖关系是宽依赖关系。

优选地,步骤(5)具体包括以下子步骤:

(5-1)设置计数器i=1;

(5-2)判断i是否大于当前map端中最后一个rdd中的分区总数,如果是则过程结束,否则转入步骤(5-3);

(5-3)初始化当前map端中最后一个rdd中的第i个分区中的当前位置cur为0;

(5-4)随机生成一个步长其中,ri表示还需要在当前map端中最后一个rdd中第i个分区中进行采样的键值对总数,ni表示当前map端中最后一个rdd中第i个分区中未被采样的键值对总数,变量u为0到1之间的随机数;

(5-5)获取该步长si指向当前map端中最后一个rdd中第i个分区中数据的键,根据该键在第i个分区对应的哈希表ti中查询对应的值,并判断该值是否满足预设条件,如果满足则进入步骤(5-6),否则返回步骤(5-4);

(5-6)设置当前map端中最后一个rdd中的第i个分区中的当前位置cur=cur+si,并判断该cur是否大于当前map端中最后一个rdd中的第i个分区中的数据长度,或者当前map端中最后一个rdd中的第i个分区中的数据长度与采样率的乘积是否大于等于第i个分区对应的哈希表ti中值的总和,如果是则过程结束,否则进入步骤(5-7);

(5-7)使用当前位置cur处的数据的键更新第i个分区对应的哈希表ti;

(5-8)设置i=i+1,并返回步骤(5-2)。

优选地,判断该值是否满足预设条件是看以下公式是否成立,如果成立则表示满足预设条件,否则表示不满足预设条件:

σ1+σ2>=0.5;

其中σ1是一个0到1之间的任意小数,且有:

其中random(0,μ2)为在[0,μ2)上取随机数的函数,μ2为0到1之间的任意小数,vj表示步长si指向的当前map端中最后一个rdd中第i个分区中数据的键在第i个分区对应的哈希表ti中的值,q表示第i个分区对应的哈希表ti中键的类别总数。

优选地,步骤(7)包括以下子步骤:

(7-1)初始化重分区策略表r,其键就是步骤(6)更新后的哈希表中的键,分区策略表r中各个键对应的值为空;

(7-2)初始化分区权重表wt,其键是从1开始,一直到第cnt个宽依赖关系对应的reduce端(其作为当前reduce端)中第一个rdd的分区长度顺次编号得到的,分区权重表wt中各个键对应的值记为w;

(7-3)设置计数器k=1;

(7-4)判断k是否大于当前map端中最后一个rdd中的分区总数,如果是则过程结束,否则转入步骤(7-5);

(7-5)在分区权重表wt中查找最大值对应的键,并在步骤(6)更新后的哈希表中获取第k个数据的键,将前一个键和后一个键分别作为键值对的值和键插入重分区策略表r中,并将分区权重表wt中该最大值更新为(w-更新后的哈希表中第k个数据的键对应的值);

(7-6)设置k=k+1,并返回步骤(7-4)。

优选地,w的初始值等于当前map端中所有分区对应的哈希表ti中值的总和除以当前map端中所有分区对应的哈希表ti中键的类别总数。

按照本发明的另一方面,提供了一种用于在spark环境中实现分区负载均衡的系统,包括:

第一模块,用于接收用户发送的spark应用程序,对该spark应用程序进行解析,以得到表征多个弹性分布式数据集rdd之间关系的rdd图、以及调度阶段的有向无环图dag;

第二模块,用于根据第一模块得到的dag图依次确定每两个相邻调度阶段之间的依赖关系,并对得到的所有依赖关系中的宽依赖关系进行编号;

第三模块,用于设置计数器cnt=1;

第四模块,用于判断cnt是否大于宽依赖关系的总数,如果是则过程结束,否则转入第五模块;

第五模块,用于对第cnt个宽依赖关系对应的map端中最后一个rdd中的所有分区中的数据进行采样,以得到表征数据键分布的、每个分区对应的哈希表;

第六模块,用于将第五模块得到的所有分区对应的哈希表进行合并,从而得到合并后的哈希表thash,将合并后的哈希表thash中的每个值均除以采样率,以得到更新后的哈希表;

第七模块,用于根据第六模块更新后的哈希表生成键值对形式的重分区策略表;

第八模块,用于设置计数器cnt=cnt+1,并返回第四模块。

总体而言,通过本发明所构思的以上技术方案与现有技术相比,能够取得下列有益效果:

(1)本发明由于采用了步骤(1)到(5),其能够精确地预测map端的数据分布,随后使用步骤(6)到(8),其基于得到的准确数据分布实现重分区策略的生成,使得分区数据分布更加均匀,因而能够解决现有基于哈希的分区方法在出现数据倾斜时,整个spark应用程序的处理时间过长的技术问题;

(2)本发明通过采用步骤(6)到(8),其执行效率高,实现复杂度低。

附图说明

图1是本发明步骤(1)中得到的rdd图的示例;

图2是本发明步骤(1)中得到的dag图的示例;

图3示出两个调度阶段之间存在窄依赖关系的示意图;

图4示出两个调度阶段之间存在宽依赖关系的示意图;

图5为本发明步骤(6)得到的合并后的哈希表;

图6是本发明用于在spark环境中实现分区负载均衡的方法的流程图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。

本发明的基本思路在于,通过优化后的基于步长的接收拒绝采样,对sparkshuffle过程中map端的数据分布进行估计,获得更加精确的map端数据分布,然后根据采样率和数据分布情况生成map端和reduce端中间数据的重分区策略,从而实现reduce端数据的均匀分布,避免因数据倾斜导致的spark应用程序执行时间过长的问题。

如图6所示,本发明提供了一种用于在spark环境中实现分区负载均衡的方法,包括以下步骤:

(1)接收用户发送的spark应用程序,对该spark应用程序进行解析,以得到表征多个弹性分布式数据集(resilientdistributeddataset,简称rdd)之间关系的rdd图(如图1所示)、以及调度阶段的有向无环图(directedacyclicgraph,简称dag图,如图2所示);

具体而言,从图1可以看出,该rdd图反映的是多个rdd(在图中是4个,但应理解这仅仅是出于举例的目的)、以及它们彼此之间的转换关系(在图中是使用箭头来表示),从图2中可以看出,该dag图包括多个调度阶段(在图中虽然仅仅只示出两个阶段,但是应该理解其并不构成对调度阶段数量的限定),其中调度阶段1(stage1)包括rdd1和rdd2,而调度阶段0包括rdd0和rdd3,调度阶段1先于调度阶段0被执行(因此称调度阶段1是调度阶段0的上一个调度阶段),各个调度阶段中不同rdd之间的转换关系和图1是完全一样的,调度阶段1被执行完毕后会产生中间结果,随后调度阶段0会读取该中间结果、以及该调度阶段0本身所包括的rdd0中的数据,将这两个数据相加后作为rdd3的输入再执行。

应该注意的是,图1和图2中的图都是spark环境中自动执行并生成的。

(2)根据步骤(1)得到的dag图依次确定每两个相邻调度阶段之间的依赖关系,并对得到的所有依赖关系中的宽依赖关系进行编号;

如果前一个调度阶段(map端)中的至少一个分区(partition)和后一个调度阶段(reduce端)中的至少一个分区之间是一对一或多对一的映射关系,则这两个调度阶段之间的依赖关系(dependency)是窄依赖(narrowdependency)关系,如图3所示,如果前一个调度阶段中的至少一个分区和后一个调度阶段中的至少一个分区之间是一对多或多对多的映射关系,则这两个调度阶段之间的依赖关系是宽依赖(shuffledependency)关系,如图4所示。

(3)设置计数器cnt=1;

(4)判断cnt是否大于宽依赖关系的总数,如果是则过程结束,否则转入步骤(5);

(5)对第cnt个宽依赖关系对应的map端(其作为当前map端)中最后一个rdd中的所有分区中的数据进行采样,以得到表征数据键(key)分布的、每个分区对应的哈希表;

在本步骤中,采样率是3%到15%之间。

本步骤具体包括以下子步骤:

(5-1)设置计数器i=1;

(5-2)判断i是否大于当前map端中最后一个rdd中的分区总数,如果是则过程结束,否则转入步骤(5-3);

(5-3)初始化当前map端中最后一个rdd中的第i个分区中的当前位置cur为0;

(5-4)随机生成一个步长其中,ri表示还需要在当前map端中最后一个rdd中第i个分区中进行采样的键值对总数,ni表示当前map端中最后一个rdd中第i个分区中未被采样的键值对总数,变量u为0到1之间的随机数;

(5-5)获取该步长si指向当前map端中最后一个rdd中第i个分区中数据的键,根据该键在第i个分区对应的哈希表ti(初始阶段该哈希表为空)中查询对应的值(value),并判断该值是否满足预设条件,如果满足则进入步骤(5-6),否则返回步骤(5-4);

具体而言,判断该值是否满足预设条件是看以下公式是否成立,如果成立则表示满足预设条件,否则表示不满足预设条件:

σ1+σ2>=0.5;

其中σ1是一个0到1之间的任意小数,σ2的定义如下:

其中random(0,μ2)为在[0,μ2)上取随机数的函数,μ2为0到1之间的任意小数,vj表示步长si指向的当前map端中最后一个rdd中第i个分区中数据的键在第i个分区对应的哈希表ti中的值,q表示第i个分区对应的哈希表ti中键的类别总数。

(5-6)设置当前map端中最后一个rdd中的第i个分区中的当前位置cur=cur+si,并判断该cur是否大于当前map端中最后一个rdd中的第i个分区中的数据长度,或者当前map端中最后一个rdd中的第i个分区中的数据长度与采样率的乘积是否大于等于第i个分区对应的哈希表ti中值的总和,如果是则过程结束,否则进入步骤(5-7);

(5-7)使用当前位置cur处的数据的键更新第i个分区对应的哈希表ti,即将第i个分区对应的哈希表ti中相同键对应的值加一;

(5-8)设置i=i+1,并返回步骤(5-2)。

(6)将步骤(5)得到的所有分区对应的哈希表进行合并,从而得到合并后的哈希表thash(如图5所示),将合并后的哈希表thash中的每个值均除以采样率,以得到更新后的哈希表;

本步骤的目的是估计当前map端中最后一个rdd中所有分区中所有数据的键的大致出现频次。

(7)根据步骤(6)更新后的哈希表生成键值对形式的重分区策略表;

本步骤包括以下子步骤:

(7-1)初始化重分区策略表r,其键就是步骤(6)更新后的哈希表中的键,分区策略表r中各个键对应的值为空;

(7-2)初始化分区权重表wt,其键是从1开始,一直到第cnt个宽依赖关系对应的reduce端(其作为当前reduce端)中第一个rdd的分区长度顺次编号(即1,2,3,…,分区长度),分区权重表wt中各个键对应的值记为w(其初始值等于当前map端中所有分区对应的哈希表ti中值的总和除以当前map端中所有分区对应的哈希表ti中键的类别总数);

(7-3)设置计数器k=1;

(7-4)判断k是否大于当前map端中最后一个rdd中的分区总数,如果是则过程结束,否则转入步骤(7-5);

(7-5)在分区权重表wt中查找最大值(初始阶段取分区权重表wt中的第一个值)对应的键,并在步骤(6)更新后的哈希表中获取第k个数据的键,将前一个键和后一个键分别作为键值对的值和键插入重分区策略表r中,并将分区权重表wt中该最大值更新为(w-更新后的哈希表中第k个数据的键对应的值);

(7-6)设置k=k+1,并返回步骤(7-4);

(8)设置计数器cnt=cnt+1,并返回步骤(4)。

本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

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