一种基于分布感知的二元等值连接倾斜优化方法和系统与流程

文档序号:15932498发布日期:2018-11-14 01:51阅读:130来源:国知局

本发明属于并行计算技术领域,更具体地,涉及一种基于分布感知的二元等值连接倾斜优化方法和系统。

背景技术

目前,针对分布式系统中spark平台的连接操作是先对表的集合进行分区,然后在分区内实现连接操作,该连接操作是在该平台的基本数据结构——弹性分布式数据集(resilientdistributeddatasets,简称rdd)基础上的操作,每个数据表可以转换成<key,value>的键值对rdd集合。spark平台现有的分区方法包括哈希分区算法和简单值域分区算法。与这两种分区算法对应的二元连接方法分别是哈希连接算法和值域连接算法。

然而,上述分布式系统的二元连接方法存在一些不可忽视的缺陷:第一,该方法由于数据集合在创建时并未考虑后续连接操作时的负载均衡,因此在reduce端连接只会在原始数据集所在的分区(节点)进行,这会导致reduce端发生负载倾斜的问题;第二,该方法并未考虑reduce端节点之间的网络io代价,因此会导致reduce端的网络io发生负载倾斜的问题;最后,该方法需要对原始数据集进行抽样,传统抽样过程需要获取原始数据集中的总量,但该总量往往是未知的,因此会导致该方法在获取原始数据集总量时的开销比较大。



技术实现要素:

针对现有技术的以上缺陷或改进需求,本发明提供了一种基于分布感知的二元等值连接倾斜优化方法和系统,其目的在于,解决现有分布式系统的二元连接方法中存在的reduce端容易发生负载倾斜,以及在获取原始数据集总量时的开销较大的技术问题。

为实现上述目的,按照本发明的一个方面,提供了一种基于分布感知的二元等值连接倾斜优化方法,包括以下步骤:

(1)使用两个mapreduce任务对准备进行二元连接操作的两个数据集合r和s分别进行采样,以获得两个样本集合d′r与d′s;

(2)分别计算样本集合d′r与d′s中倾斜键的权重和大小,将二者进行比较,选择比较结果中较大的一个所对应的数据集合作为主表,另一个所对应的数据集合作为副表;

(3)获取步骤(2)中选定的主表和副表中各个簇的代价估计值,根据该代价估计值确定大簇集合和小簇集合,并为大簇集合和小簇集合分别生成rdd分区方案;

(4)使用步骤(3)中得到的大簇集合和小簇集合的rdd分区方案对主表和副表进行分区;

(5)根据步骤(4)中对主表和副表进行分区的结果在reduce端完成分区内的连接操作。

优选地,样本集合d′r中倾斜键权重和的计算公式为:

其中,cβ为样本集合d′r中字面值为β的簇,β∈d′r,且集合cβ中所有元素的权重和大于样本集合d′r权重和的平均值

集合cβ中所有元素的权重和其中sumweightβ表示样本集合d′r中字面值为β的元素的权重和,且有:其中wβ表示样本集合d′r中字面值为β的元素的权重。

优选地,样本集合d′r权重和的平均值其中表示样本集合d′r中所有键的权重和,n为spark节点中rdd分区的总数目,且有

其中表示任意一个,cα为样本集合d′r中任意一个字面值为α的簇,且有:

其中wα表示样本集合d′r中字面值为α的单行记录的权重,dri表示在数据集合r的第i个rdd分区pri中抽样的数据,i表示数据集r的第i个rdd分区编号,且有0≤i≤m,m为数据集合r的实际rdd分区数量减1,表示抽样的数据dri中字面值为α的键的权重,且有其中numpri为数据集合r的第i个rdd分区pri的大小,为抽样的数据dri的大小。

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

(3-1)获取选定的主表和副表中各个簇的代价估计值:

其中表示簇cα的代价估计值,wn和wd分别表示网络开销和本地磁盘开销,wn+wd=1;

(3-2)根据步骤(3-1)中获取的主表和副表中各个簇的代价估计值分别确定主表和副表中的所有大簇和所有小簇,所有大簇形成大簇集合skewkeys,所有小簇形成小簇集合normalkeys;

(3-3)根据大簇cα的剩余代价和rdd分区的剩余代价确定大簇集合skewkeys的rdd分区方案skewkeymap;

(3-4)将小簇集合normalkeys中的小簇以剩余代价从小到大的顺序划分到剩余代价从大到小且不为零的rdd分区中,从而得到小簇集合的分区方案normalkeymap;

优选地,大簇是主表和副表中,代价超过rdd分区平均代价mean′的簇,且有主表和副表中的其余簇为小簇。

优选地,步骤(3-3)进一步包括以下子步骤:

(3-3-1)判断大簇cα的剩余代价与rdd分区平均代价之间的关系是否有若是则转入步骤(3-3-2),否跳转步骤(3-3-3);

(3-3-2)将大簇集合skewkeys中大簇cα的键值对直接划分到剩余代价数组reducearray中正序第一个costid值为mean′的分区的键值对<id,costid>,并记录下对应的划分比率<id,rate>,将<id,rate>添加到簇分区列表idlistα中,将簇α和簇分区列表idlistα作为键值对形成倾斜键分区方案skewkeymap,并且将值减去mean′以得到新的将剩余代价costid减去mean′以得到新的costid,并返回步骤(3-3-1),其中costid表示reduce编号为id的分区的剩余代价,costid的初始大小为mean′,id为剩余代价数组reducearray中划分给簇cα的分区的reduce编号,且0≤id≤n-1,rate表示分区占大簇集合skewkeys中大簇cα总代价的比率,且有

(3-3-3)判断大簇cα的剩余代价是否等于0,若是,则进入步骤(3-4),否则进入步骤(3-3-4);

(3-3-4)在剩余代价数组reducearray中costid最小且大于的键值对<id,costr>,记录下对应的划分比率<id,rate>,将该划分比率<id,rate>添加到簇分区列表idlistα中,并且将设置为0,将costid减去mean′以得到新的costid,然后转入步骤(3-4)。

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

(3-4-1)对于小簇集合normalkeys中所有小簇cγ而言,根据该小簇cγ的总代价进行倒序排列;

(3-4-2)在rdd分区剩余代价数组reducearray中找到剩余代价costid最大的键值对<id,costid>,将键值对<γ,id>添加到划分方案normalkeymap中,同时在大于costid时,将减去costid作为新的小于等于costid时,将设置为0;

(3-4-3)将划分方案normalkeymap按照键γ由大到小进行排序,以得到小簇的最终划分方案normalkeymap。

优选地,对主表进行分区的过程包括以下子步骤:

(4-1)在大簇集合的rdd分区方案skewkeymap中取出一个大簇α及其对应的簇分区列表idlistα,用随机数法将簇分区列表idlistα划分到对应的分区;

(4-2)在小簇集合的rdd分区方案normalkeymap中取出一个小簇γ及其对应的簇分区列表idlistγ,采用二分法在簇分区列表idlistγ中查找小簇γ对应的第i个键值对<idi,ratei>,且满足ratei-1<γ≤ratei;

(4-3)判断是否有0≤i≤n-1,如果是则将小簇γ划分到分区idi中;否则表示γ>raten-1,则将小簇γ按照哈希方法划分到hash(cγ)modn的分区中;

对副表进行分区的过程包括以下子步骤:

(4-1’)在大簇集合的rdd分区方案skewkeymap中取出一个大簇μ及其对应的簇分区列表idlistμ,将大簇μ划分到簇分区列表idlistμ对应的分区;

(4-2’)在小簇集合的rdd分区方案normalkeymap中取出一个小簇λ及其对应的簇分区列表idlistλ,采用二分法在簇分区列表idlistλ中查找小簇λ对应的第j个键值对<idj,ratej>,且满足ratej-1<λ≤ratej;

(4-3’)判断是否有0≤j≤n-1,如果是则将小簇λ划分到分区idj中;否则表示λ>raten-1,则将小簇λ按照哈希方法划分到hash(cλ)modn的分区中。

优选地,步骤(1)的采样过程采用的是水池抽样算法。

按照本发明的另一方面,提供了一种基于分布感知的二元等值连接倾斜优化系统,其特征在于,包括:

第一模块,用于使用两个mapreduce任务对准备进行二元连接操作的两个数据集合r和s分别进行采样,以获得两个样本集合d′r与d′s;

第二模块,用于分别计算样本集合d′r与d′s中倾斜键的权重和大小,将二者进行比较,选择比较结果中较大的一个所对应的数据集合作为主表,另一个所对应的数据集合作为副表;

第三模块,用于获取第二模块中选定的主表和副表中各个簇的代价估计值,根据该代价估计值确定大簇集合和小簇集合,并为大簇集合和小簇集合分别生成rdd分区方案;

第四模块,用于使用第三模块中得到的大簇集合和小簇集合的rdd分区方案对主表和副表进行分区;

第五模块,用于根据第四模块中对主表和副表进行分区的结果在reduce端完成分区内的连接操作。

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

1、本发明通过对准备进行二元连接操作的两个数据集合分别进行采样,根据采样结果进行大小簇的确定和主表副表的确定,从而调整了两个数据集合在rdd分区的分布,进而解决了现有二元连接方法在reduce端的负载倾斜问题;

2、本发明考虑了网络开销和本地磁盘开销的比率,针对倾斜数据实现了更加高效的reduce端连接运算的负载均衡;

3、本发明采用水池抽样算法快速得到了样本数据,这一方面解决了现有方法中由于原始数据集中总量未知所导致的获取原始数据集总量的开销较大的技术问题,同时采样后的样本数据集保持了原始数据集的数据分布。

附图说明

图1是本发明基于分布感知的二元等值连接倾斜优化方法的流程图。

具体实施方式

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

本发明通过研究大表等值连接下的数据倾斜的问题,提出了一种基于分布感知的大表等值二元连接的倾斜优化方法。

本发明的核心思想在于,根据i/o代价将二元等值连接中第一张表中倾斜键分散到部分分区,为保证连接的正确性,另一个表也只需要将相同簇广播到数据集合r中倾斜键(key)所在的分区,尽可能减少额外增加的洗牌(shuffle)传输负载,实现整体的reduce端负载均衡。键指向某一行或一个元组,簇是相同键的集合。

如图1所示,本发明基于分布感知的二元等值连接倾斜优化方法包括以下步骤:

(1)使用两个mapreduce任务对准备进行二元连接操作的两个数据集合r和s分别进行采样,以获得两个样本集合d'r与d′s;

在连接过程中,i/o代价的计算需要原始数据集总记录的数量分布,而计算数据集的真实数量开销非常大,对数据集合进行采样可以得到数据的分布,因此对于连接操作的划分,需要首先通过采样来获取数据分布。本步骤中使用的采样算法为水池抽样算法,以取得理想的获取数据分布的效果,并且尽量减小开销。

考虑到数据集过大时采样的性能问题,从每个分区固定抽取最多200个样本数据,总共样本数据不超过100000,如果超过了则采按固定间隔取100000个,固定间隔为样本数据量200比100000的比值。

(2)分别计算样本集合d'r与d′s中倾斜键的权重和大小,将二者进行比较,选择比较结果中较大的一个所对应的数据集合作为主表,另一个所对应的数据集合作为副表;

样本集合d'r中倾斜键权重和的计算公式为:

其中,cβ为样本集合d'r中字面值为β的簇(该簇是样本集合中字面值相同的键的集合),β∈d'r,且集合cβ中所有元素的权重和大于样本集合d′r权重和的平均值meand′r’

其中,其中sumweightβ表示样本集合d′r中字面值为β的元素的权重和,且有:其中wβ表示样本集合d′r中字面值为β的元素的权重。

另外,

其中,表示样本集合d′r中所有键的权重和,n为spark节点中rdd分区的总数目,且有

其中表示任意一个,cα为样本集合d′r中任意一个字面值为α的簇,且有:

其中wα表示样本集合d′r中字面值为α的单行记录的权重,dri表示在数据集合r的第i个rdd分区pri中抽样的数据,i表示数据集r的第i个rdd分区编号,且有0≤i≤m,m为数据集合r的实际rdd分区数量减1,表示抽样的数据dri中字面值为α的键的权重;

样本集合d'r存在于spark节点的m个rdd分区中,由于每个rdd分区为一个集合,分别为从数据集合r的每个rdd分区抽样得到,因此集合r也存在于spark节点的m个rdd分区中。

在抽样的数据dri中,所有键的权重相同,均为

其中为数据集合r的第i个rdd分区pri的大小(即元素的数量),为抽样的数据dri的大小。

同理,采用与以上样本集合d′r中倾斜键权重和相同的计算方式,可求得样本集合d′s中倾斜键权重和sumweightskews,比较sumweightskewr和sumweightskews的大小,大的则其对应的数据集合为主表,另外一个数据集合为副表。

(3)获取步骤(2)中选定的主表和副表中各个簇的代价估计值,根据该代价估计值确定大簇集合和小簇集合,并为大簇集合和小簇集合分别生成弹性分布式数据集(resilientdistributeddatasets,简称rdd)分区方案;

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

(3-1)获取选定的主表和副表中各个簇的代价估计值:

其中表示簇cα的代价估计值。

wn和wd分别表示网络开销和本地磁盘开销,wn+wd=1。

本发明实施例中并行计算系统构筑在含千兆以太网卡的局域网中,局域网中的单位数据传输代价与本地每页数据平均访问时间开销的比例为1.6∶1,则分别为数据集合r中的簇以及数据集合s中的簇的权重和。其中如果在数据集合r或s中不存在某个簇cα,则取或有

(3-2)根据步骤(3-1)中获取的主表和副表中各个簇的代价估计值分别确定主表和副表中的所有大簇和所有小簇,所有大簇形成大簇集合skewkeys,所有小簇形成小簇集合normalkeys;

具体而言,大簇是主表和副表中,代价超过rdd分区平均代价mean′的簇,且有其余簇为小簇。

(3-3)根据大簇cα的剩余代价和rdd分区的剩余代价确定大簇集合skewkeys的rdd分区方案skewkeymap;

本步骤进一步包括以下子步骤:

(3-3-1)判断大簇cα的剩余代价与rdd分区平均代价之间的关系是否有若是则转入步骤(3-3-2),否跳转步骤(3-3-3):

(3-3-2)将大簇集合skewkeys中大簇cα的键值对直接划分到剩余代价数组reducearray中正序第一个costid值为mean′的分区的键值对<id,costid>,并记录下对应的划分比率<id,rate>,将<id,rate>添加到簇分区列表idlistα中,将簇α和簇分区列表idlistα作为键值对形成倾斜键分区方案skewkeymap,并且将值减去mean′以得到新的将剩余代价costid减去mean′以得到新的costid,并返回步骤(3-3-1),其中costid表示reduce编号为id的分区的剩余代价,costid的初始大小为mean′,id为剩余代价数组reducearray中划分给簇cα的分区的reduce编号,且0≤id≤n-1,rate表示分区占大簇集合skewkeys中大簇cα总代价的比率,且有

(3-3-3)判断大簇cα的剩余代价是否等于0,若是,则进入步骤(3-4),否则进入步骤(3-3-4);

(3-3-4)在剩余代价数组reducearray中costid最小且大于的键值对<id,costr>,记录下对应的划分比率<id,rate>,将该划分比率<id,rate>添加到簇分区列表idlistα中,并且将设置为0,将costid减去mean′以得到新的costid,然后转入步骤(3-4);

按照以上步骤依次划分大簇集合skewkeys中的每一个大簇,从而得到每个大簇的rdd分区方案skewkeymap。

通过步骤(3-3)的过程,保证大簇集合中的大簇尽可能划分到完整的分区,从而降低reduce各节点的io代价。

(3-4)将小簇集合normalkeys中的小簇以剩余代价从小到大的顺序划分到剩余代价从大到小且不为零的rdd分区中,从而得到小簇集合的分区方案normalkeymap;

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

(3-4-1)对于小簇集合normalkeys中所有小簇cγ而言,根据该小簇cγ的总代价进行倒序排列;

(3-4-2)在rdd分区剩余代价数组reducearray中找到剩余代价costid最大的键值对<id,costid>,将键值对<γ,id>添加到划分方案normalkeymap中,同时在大于costid时,将减去costid作为新的小于等于costid时,将设置为0;

(3-4-3)将划分方案normalkeymap按照键γ由大到小进行排序,以得到小簇的最终划分方案normalkeymap。

本步骤的优点在于,将小簇尽可能划分到少的分区,以降低io代价。

(4)使用步骤(3)中得到的大簇集合和小簇集合的rdd分区方案对主表和副表进行分区;

对主表进行分区包括以下子步骤:

(4-1)在大簇集合的rdd分区方案skewkeymap中取出一个大簇α及其对应的簇分区列表idlistα,用随机数法将簇分区列表idlistα划分到对应的分区;

随机数法的示例如下:假设idlistα值为[(1,0.5),(2,0.2),(5,0.3)],则取[0,100)内的随机整数k,如果k∈[0,50),则将α划分到分区1;如果k∈[50,70),则将α划分到分区2;如果k∈[70,100),则将α划分到分区5。

(4-2)在小簇集合的rdd分区方案normalkeymap中取出一个小簇γ及其对应的簇分区列表idlistγ,采用二分法在簇分区列表idlistγ中查找小簇γ对应的第i个键值对<idi,ratei>,且满足ratei-1<γ≤ratei;

(4-3)判断是否有0≤i≤n-1,如果是则将小簇γ划分到分区idi中;否则表示γ>raten-1,则将小簇γ按照哈希方法划分到hash(cγ)modn的分区中。

对副表进行分区包括以下子步骤:

(4-1’)在大簇集合的rdd分区方案skewkeymap中取出一个大簇μ及其对应的簇分区列表idlistμ,将大簇μ划分到簇分区列表idlistμ对应的分区;

(4-2’)在小簇集合的rdd分区方案normalkeymap中取出一个小簇λ及其对应的簇分区列表idlistλ,采用二分法在簇分区列表idlistλ中查找小簇λ对应的第j个键值对<idj,ratej>,且满足ratej-1<λ≤ratej;

(4-3’)判断是否有0≤j≤n-1,如果是则将小簇λ划分到分区idj中;否则表示λ>raten-1,则将小簇λ按照哈希方法划分到hash(cλ)modn的分区中。

根据分区方案用一次mapreduce任务进行数据划分,并且在reduce端完成连接操作。在策略上,若r表倾斜度高于s,我们对r中倾斜键和非倾斜键分开处理:倾斜键按照分区方案划分给部分rdd分区,非倾斜键填满剩余未满分区;s中与r集合中倾斜key相同的key按照分区方案分发到r集合中倾斜键所在的分区,剩余key按照分区方案发送剩余分区。

(5)根据步骤(4)中对主表和副表进行分区的结果在reduce端完成分区内的连接操作。

本步骤采用的是spark默认的分区内连接算法。

下面用一个例子展示连接过程。设r(id,名字)=[(1,“张三”),(2,“李四”),(3,“王五”),(3,”测试”)],s(id,年龄)=[(1,30),(3,29),(4,21)],那么按以下三个步骤生成连接数据:

①首先对各自列表内部数据聚合,生成数组r(id,名字)=[(1,[“张三”]),(2,[“李四”]),(3,[“王五”,“测试”])],以及s(id,年龄)=[(1,[30]),(3,29),(4,21)];

②对数组初步连接,生成集合{(1,([“张三”],[30]),(3,([“王五”,“测试”],[29]))}。

③对该集合每一个记录进行笛卡尔积,得到连接后的记录{(1,(“张三”,30)),(3,(“王五”,29)),(3,(“测试”,29))}。

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

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