发明内容
本发明的目的是提供一种基于Spark的抗偏斜的数据分片方法,解决Spark本身的抗偏斜机制问题,解决现有的Hash方法和Range方法无法处理分片偏斜的问题。
本发明提供一种基于Spark的抗偏斜的数据分片方法,包括如下步骤:
步骤A:获取预估的中间数据的键簇分布以及Spark应用类型,再基于获取的键簇分布生成与Spark应用类型相匹配的分片策略;
其中,所述键簇为键相同的键值对集合,Spark应用类型包括无需排序的应用类型和需排序的应用类型,所述分片策略包括分别与无需排序、需排序的应用类型相对应的基于键簇重分配的哈希算法策略和基于键簇分割的范围分片算法策略;
步骤B:利用生成的分片策略计算出Map输出数据中每个键值对的reduce索引号,再基于reduce索引号的大小顺序将键值对依次写入中间数据文件中,使得每个键值对存在对应的唯一reduce分片;
其中,每个reduce索引号对应一个reduce分片,步骤B中计算出每个键值对的reduce索引号的过程为如下步骤a或步骤b:a:利用所述键簇重分配的哈希算法策略中的偏斜分片表和重分配策略表识别出Map输出数据中需采用哈希分片算法获取reduce索引号的键值对以及需利用重分配策略表获reduce索引号的键值对,并分别计算出reduce索引号;
所述偏斜分片表包括偏斜分片的索引号,所述重分配策略表包括偏斜分片中待重分配键簇的键和所分配的分片的索引号;
b:利用所述基于键簇分割的范围分片算法策略中的边界表获取Map输出数据中每个键值对的键与分界点的键的前后序列关系,再基于所述前后序列关系计算出每个键值对的reduce索引号;
所述边界表包括分界点对应的键和分界点的权重,所述分界点是相邻两个分片的分割节点。
Map输出数据中的键值对写入中间数据文件之前存在于内存中,因此可以获取预估的中间数据的键簇分布。
本发明针对不同Spark应用类型生成了相匹配的分片策略,无需排序的应用类型对应了基于键簇重分配的哈希算法策略,需排序的应用类型对应了基于键簇分割的范围分片算法策略。其中,基于键簇重分配的哈希算法策略和基于键簇分割的范围分片算法策略均考虑分片上的负载均衡,基于键簇重分配的哈希算法策略中通过生成偏斜分片表和重分配策略表可以对预测的偏斜分片上的负载进行均衡处理,将部分键簇分配给其他分片,实现分片上的负载均衡;基于键簇分割的范围分片算法策略中通过边界表中的边界点对键簇进行合理分配分片。且由于所谓排序是指基于键簇的键进行排序,因此利用键值对的键与分界点的键的前后序列关系可知键值对与分界点的位置关系,再基于分界点是相邻分片的分割点,进而可以获知键值对所属的分片,即获取到reduce索引号,使得在实际shuffle阶段的读过程中,每个reduce任务,从中间数据文件中读取属于自己的数据,实现分片负载的均衡。
应当说明,若同时存在多个中间节点,则存在多个中间数据文件,在将键值对写入中间数据文件时,不论写入哪个中间数据文件,键值对的reduce索引号均是依据本发明所述方法来确定的,每个键值对存在唯一对应的reduce分片,实现数据分片,进而使得每个reduce任务从对应中间节点的中间数据文件中读取属于自己的数据。
进一步优选,生成基于键簇重分配的哈希算法策略的过程如下:
步骤1:利用哈希分片算法给每个键簇分配索引号得到哈希分片,并计算每个哈希分片的权重以及哈希分片的权重均值;
其中,同一索引号的键簇构成一个哈希分片;
步骤2:基于每个哈希分片的权重预测偏斜分片,并将偏斜分片的索引号记录在偏斜分片表中;
其中,哈希分片的权重超过偏斜阈值时,所述哈希分片为预测的偏斜分片;
步骤3:将每个偏斜分片中的键簇划分至两个子集;
其中,第一子集中的键簇保留在原偏斜分片中,第二子集中的键簇是待重新分配的;
步骤4:采用First-Fit算法对每个偏斜分片的第二子集中键簇进行哈希分片的重新分配,并在重分配策略表中记录重分配的键簇的键以及所分配的哈希分片的索引号。
索引号的计算方式为((key.hashcod+r)%r)。其中,key.hashcode表示键的哈希码,r表示reduce分片的数量,例如:索引号范围为0至r-1;每个哈希分片的权重为哈希分片中每个键簇的权重之和。键簇的权重是现有方法获取的,要获取键簇的权重,首先需要了解中间数据的键(key)频率。在现有的方法中,key频率可以通过多种方法获取。一种常见的方法是直接对中间数据进行采样,另一种方法是通过对输入数据进行采样来估计中间数据的分布。在设定键簇的权重时,可以基于不同的因素进行计算。在现有的方法中,最常见的方法是基于key频率,除此之外,也可以添加多种其他因素,比如基于任务工作量和数据本地性等多种因素。
偏斜阈值P=Wavg*tol。Wavg为哈希分片的权重均值,tol为容忍度,容忍度tol的取值范围为[1.0,1.3]。优选容忍度tol为1.2。
进一步优选,步骤B中利用基于键簇重分配的哈希算法策略计算出Map输出数据中每个键值对的reduce索引号的过程如下:
步骤5:利用哈希分片算法计算Map输出数据中每个键值对的reduce索引号,并分别判断偏斜分片表中是否存在每个键值对的reduce索引号,若存在,执行步骤6;否则,对应键值对的reduce索引号不变;
步骤6:查找重分配策略表中是否存在对应键值对的键,若存在,根据重分配策略表获取所述键值对应的索引号;若不存在,对应键值对的reduce索引号不变。
偏斜分片表和重分配策略表中的索引号与reduce索引号均为同一含义。
进一步优选,步骤3中将每个偏斜分片中的键簇划分为两个子集时均执行如下步骤:
步骤3.1:将偏斜分片中的键簇按照权重大小进行降序排列,并获取偏斜分片的剩余空间值;
其中,偏斜分配的剩余空间值rest的初始值等于哈希分片的权重均值Wavg。
步骤3.2:按照如下规则按序分配键簇直至偏斜分配中所有的键簇均分配完成;
其中,步骤3.2的执行过程如下:
C:按序获取一个键簇;
D:判断键簇的权重是否小于或等于剩余空间值,若是,将所述键簇划分至第一子集中,并更新剩余空间值;否则,将键簇划分至第二子集中;
E,按序获取下一个键簇并返回步骤D,直至偏斜分配中所有的键簇均分配完成;
其中,步骤D中将当前剩余空间值减去当前划分至第一子集的键簇的权重得到更新的剩余空间值。
进一步优选,步骤3中第一子集和第二子集之间键簇的关系如下:
式中,Wavg为哈希分片的权重均值,表示索引号为j的偏斜分片的第一子集,k表示第一子集中键为k的键簇,Ck表示键为k的键簇的权重,表示索引号为j的偏斜分片的第二子集,表示第二子集中键簇的最小权重。
进一步优选,步骤4中采用First-Fit算法对每个偏斜分配的第二子集中键簇进行哈希分片的重分配的过程如下:
步骤4.1:将所有偏斜分配中第二子集的所有键簇按照权重大小降序排列,以及将所有哈希分片按照权重大小升序排列;
步骤4.2:按序获取一个哈希分片,并判断获取的哈希分片的权重是否小于哈希分片的权重均值,若小于,执行步骤4.3;否则,执行步骤4.5;
步骤4.3:计算获取的哈希分片的剩余空间值,并依据键簇排列按序处理待分配的键簇;
其中,步骤4.3中依据键簇排列按序处理待分配的键簇的具体过程如下:
F:判断第一个键簇的权重是否小于或等于剩余空间值,若是,将所述键簇分配给获取的哈希分片,并更新剩余空间值;否则,暂不分配;
其中,获取的哈希分片的剩余空间值的初始值等于哈希分片的权重均值与该哈希分片的权重之差。
G:按序判断下一个键簇的权重是否小于或等于更新后的剩余空间值,若是,将所述键簇分配给获取的哈希分片,并更新剩余空间值;否则,暂不分配;
其中,每次剩余空间值更新时,将当前剩余空间值减去当前划分至所述哈希分片的键簇的权重得到更新的剩余空间值;
H:重复G步骤,直至所有的键簇均被判断处理过;
步骤4.4:判断是否还存在未被分配的键簇,若不存在,步骤4中所有的键簇均完成分配;若存在,则判断是否还存在哈希分片未被处理;
若存在哈希分片,按序获取下一个哈希分片,并判断获取的哈希分片的权重是否小于哈希分片的权重均值,若小于哈希分片的权重均值,再执行步骤4.3,若不小于,执行步骤4.5;
若不存在哈希分片,执行步骤4.5;
步骤4.5:将未被分配的键簇按照权重大小降序排列,再将未被分配的键簇按照序列顺序依次分配给步骤4.1中升序排列的各个哈希分片。
步骤4.5中未被分配的键簇按照序列顺序依次分配,例如第一个键簇分配给第一个哈希分片,第二个键簇分配给第二个哈希分片,依次分配下去。
进一步优选,所述基于键簇分割的范围分片算法策略的生成过程如下:
S1:基于每个键簇的键按照Spark中的默认排序规则对键簇进行排序得到有序序列,再从有序序列中选择出分界点;
其中,所述有序序列中每个节点对应一个键簇,每个节点的序列标记表示对应键簇的键;
获取每个键簇的权重以及分片数量并计算出分片权重均值,再基于有序序列中各个键簇的权重并以分片权重均值为分割步长识别出有序序列中的分界点,所述分界点为相邻分片的分割点,所述分界点的数量比所述分片数量少1;
S2:计算每个分界点的权重并将每个分界点的键以及每个分界点的权重记录在边界表中。
例如,键簇的键的表述为A、B、C等,将所有的键簇排序形成的有序序列如ABCDEFG…ST…,其中每个节点的序列标记表示对应键簇的键。由于分界点为相邻分片的分割点,所有分片的数量比分界点的数量多1。
进一步优选,利用基于键簇分割的范围分片算法策略计算Map输出数据中每个键值对的reduce索引号时均执行如下过程:
S3:查找边界表中是否存在分界点对应的序列标记在有序序列中位于键值对的键所对应的序列标记之后;
若存在所述分界点,所述键值对的reduce索引号为所存在的分界点中与第一个分界点的相邻前一个分片的索引号;
若不存在所述分界点,查找边界表中是否存在分界点对应的序列标记与键值对的键所对应的序列标记相同,若存在,执行S4;若不存在,所述键值对的reduce索引号为最后一个分片的索引号;
S4:获取序列标记相同n个分界点以及所述分界点分割的n+1个分片,再随机生成一个小数u,并依据所述n个分界点的权重与小数u识别键值对所需分配的分片;
其中,步骤S4中识别键值对所需分配的分片的具体过程如下:
c:判断小数u是否小于或等于所述n个分界点中第i个分界点的权重,i=1;
若是,所述键值对的reduce索引号为所述n+1个分片中的第i个分片的索引号;若不是,执行步骤d:
d:更新i值,并判断更新后的i值是否小于或等于n,若是i小于或等于n,再判断所述小数u是否小于或等于所述n个分界点中前i个分界点的权重累加和;若是小于或等于前i个分界点的权重累加和,所述键值对的reduce索引号为所述n+1个分片中的第i个分片的索引号;否则,继续执行步骤d;
若是i大于n,所述键值对的reduce索引号为所述n+1个分片中的第n+1个分片的索引号;
其中,更新后的i值如下所示:
i=i+1。
若有序序列依照键升序排列时,分界点的序列标记在有序序列中位于键值对的键所对应的序列标记之后则表示分界点的键大于键值对的键,例如ABCDEFG…ST…的有序序列,若C为一个分界点,待分配的Map输出数据中键值对的键为A,则C大于A,且在有序序列中,序列标记C位于序列标记A之后。
若有序序列依照键降序排列,分界点的序列标记在有序序列中位于键值对的键所对应的序列标记之后则表示分界点的键小于键值对的键,例如…TS…GFEDCBA的有序序列,若C为一个分界点,待分配的Map输出数据中键值对的键为D,则C小于D,且在有序序列中,序列标记C位于序列标记D之后。
进一步优选,S1中从有序序列中选择出分界点的过程如下:
e:按照所述有序序列中键簇的键顺序依次累加键簇的权重直至得到的累加权重大于或等于分片权重均值,并将当前键簇对应在所述有序序列中的节点作为第一个分界点;
其中,若累加权重大于分片权重均值,将当前键簇的权重拆分为两个权重,第二个权重等于所述累加权重减去所述分片权重均值,且将第二个权重作为更新后的当前键簇的权重;
f:再按照所述有序序列中键簇的键顺序依次累加位于前一个分界点之后的键簇的权重直至累加权重大于或等于分片权重均值,并获取当前键簇对应的节点,并将所述节点作为下一个分界点;
重复步骤f直至得到的分界点的数量等于分片数量减一。
其中,若步骤e或步骤f中累加权重大于分片权重均值,下一次执行步骤f时所述位于前一个分界点之后的键簇表示以权重更新后的当前键簇为起始点;
若步骤e或步骤f中累加权重等于分片权重均值,下一次执行步骤f时所述位于前一个分界点之后的键簇表示以当前键簇相邻的后一个键簇为起始点。
进一步优选,分界点的权重的计算公式如下:
式中,frctnj,k表示分界点的权重,cj表示所述分界点对应的当前键簇的权重中拆分的第一个权重,表示分界点对应的键簇的初始权重,j表示与分界点相邻的前一个分片,k表示分界点的键。
有益效果
本发明提供的一种基于Spark的抗偏斜的数据分片方法,既满足了对输出有排序需求的应用,又适用于非排序的普通应用,这两种方法可以减少数据偏斜对Spark性能的影响,不但可以提高分片均衡程度,还可以减少reduce任务的总体执行时间,从而提高整体作业的执行效率。如果分片负载不均衡,则会导致数据量大的任务比数据量小的任务花费更长的执行时间,大任务延长了整个作业的运行时间,导致作业执行效率降低。另外,大分片还容易导致节点间数据传输失败和传输时间增加,进一步降低执行性能,因此本发明提出的抗偏斜的分片算法,可以有效地解决上述问题。
当数据中存在大量相同的key或者大量key指向相同的哈希索引时,原生的哈希分片方法会导致严重的偏斜问题,即部分分片包含的数据量远大于其他分片。但是本发明生成的基于键簇重分配的哈希算法策略中可以有效地预测出偏斜情况,定位偏斜分片,将偏斜分片的一部分键簇分配给其他数据量小的分片,将这部分键簇重分配的情况记录到重分配策略表中。重分配策略表采用二级结构,即重分配分片索引-重分配键簇的键的结构。在实际的分片过程中,每个键值对只消耗极少的时间就能通过重分配表获取自己所属的分片索引号。另外,重分配策略表生成只消耗很短的时间,因此,整个策略生成到应用的过程都非常高效。
当数据中存在大量相同的key时,若采用原生范围分片算法,高频key(对应键簇的权重很大)选为分界点的概率大大增加,这会引发严重的偏斜问题,一些分片的数据量会远大于其他分片。本发明的基于键簇分割的范围分片算法策略可以避免高频key导致的分片偏斜问题,其划分边界上的高频key,将它分配给多个分区,而不是仅由一个分区进行处理,这样使得各个分区数据均匀分布。另外,在实际的分片过程中,每个键值对在计算分片索引号时,只需要查找一个长度为(分片数-1)的数组,即分界点数组,这样的计算过程只消耗很短的时间。
具体实施方式
下面将结合实施例对本发明做进一步的说明。
本发明提供的一种基于Spark的抗偏斜的数据分片方法,能够根据中间数据键簇(key cluster)分布以及Spark应用的类型制定合适的分片策略。如图1所示,整个过程分为两部分,分片策略的生成和分片策略的应用。其中,针对于不同Spark类型的应用,在策略生成和应用时采用不同的方法。对于具有排序需求的操作,采用基于键簇分割的范围分片算法策略,生成一个带权重的边界数组;对于其他操作,采用基于键簇重分配的哈希算法策略,生成偏斜分片表和重分配策略表。分片策略生成时,只是在模拟分片的过程,以得出合适的分片方式,。当策略预先生成后,在实际的shuffle过程中,才进行真正的分片,按分片策略分配中间数据中的每一个键值对到相应的分片,使得每个reduce分片处理的数据量大小均衡,减轻分片偏斜造成的执行性能下降。具体步骤如下:步骤A-步骤B
步骤A:基于获取的键簇分布生成与Spark应用类型相匹配的分片策略。
其中,根据Spark应用的类型生成相应的分片器,分片器根据中间数据keycluster分布和reduce任务数量计算相应的分片策略。分片器包含一个getPartition方法,每个分配策略的getPartition方法不同,getPartition方法中输入为键值对的键(key),输出为该键值对所属的reduce分片的reduce索引号。
步骤B:利用生成的分片策略计算出Map输出数据中每个键值对的reduce索引号,再基于reduce索引号的大小顺序将键值对依次写入中间数据文件中。
其中,Map的输出数据由许多键值对组成,每个键值对按照getPartition方法获取键所对应的reduce索引号,然后按照索引号从小到大的顺序,将键值对进行排序,然后将键值对依次写入到中间数据文件中。在shuffle阶段的读过程中,每个reduce任务,从每个节点的中间文件中读取属于自己的数据。其中,getPartition计算的方法都由步骤A的分片策略决定,因此,分片策略得以应用在步骤B的实际的分片过程中。
第一部分,针对无需排序的Spark应用。
本发明针对无需排序的Spark应用,生成基于键簇重分配的哈希算法策略,其能够中间数据的key cluster分布有效地预知reduce任务可能发生的偏斜问题,其能准确地筛选出偏斜的分片,并指定出合适的分片策略,将偏斜分片的一部分键值对分配给适宜的分片。生成基于键簇重分配的哈希算法策略的过程如下:
步骤1:利用哈希分片算法(hash方法)给每个键簇分配索引号得到哈希分片,并计算每个哈希分片的权重以及哈希分片的权重均值Wavg;
每个hash分片的权重为其上各个键簇权重之和。如图2所示,每个hash分片用虚线矩形框表示,虚线框内的键簇为该hash分片所有。最后,计算分片的权重均值Wavg。
步骤2:基于每个哈希分片的权重预测偏斜分片,并将偏斜分片的索引号记录在偏斜分片表Predis中。其中,哈希分片的权重超过偏斜阈值时,该哈希分片为预测的偏斜分片。
Predis={j|Wj>Wavg×tol}
式中,Wj表示第j个分片的权重,tol为容忍度,Wavg*tol得到偏斜阈值P。
若各key cluster的权重大小相差较小,可设置较小的容忍度,若key cluster权重大小差异较大,则可设置较大的容忍度。为了平衡各种情况,本实施中将容忍度设置为1.2。
步骤3:将每个偏斜分片中的键簇划分至两个子集。
用j表示偏斜分片表Predis中的某一个偏斜分片的索引号,将哈希分片j包含的键簇分成两个子集:第一子集和第二子集其中第一子集中的键簇保留在原哈希分片,而第二子集中的键簇为待重分配哈希分片的。在分割过程中,尽量将权重大的键簇保留在并使得的总权重接近分片权重均值。在分割过程中,尽量将权重大的键簇保留在并使得的总权重接近分片权重均值Wavg。第一子集和第二子集之间键簇的关系如下:
上述公式表示步骤3结束后,偏斜分片j的第一子集和第二子集的一个状态。
具体的,步骤3中对每个偏斜分片中的键簇划分两个子集的过程均执行如下步骤:
步骤3.1:将偏斜分片中的键簇按照权重大小进行降序排列,并获取偏斜分片的剩余空间值rest;此时,rest初始值为分片均值Wavg。
步骤3.2:按照如下规则按序分配键簇直至偏斜分配中所有的键簇均分配完成;
C:按序获取一个键簇;
D:判断键簇的权重是否小于或等于剩余空间值,若是,将所述键簇划分至第一子集中,并更新剩余空间值;否则,将键簇划分至第二子集中;
例如,按照获取一个键簇的键为k,对应的键簇权重为ck,偏斜分片j,若ck小于rest,则将该键簇加入该偏斜分片j,并保存在第一子集更新后的剩余空间值rest=rest-ck;否则,将其保存到第二子集
E,按序获取下一个键簇并返回步骤D,直至偏斜分配中所有的键簇均分配完成;
如图2的第3步所示,偏斜分片为分片0和分片s,我们按上述方法分别分割各个偏斜分片。以第s个分片为例,其包含7个键簇,其中EFG属于第一子集Khash s,保存在原hash分片,ABCD属于第二子集Kredis s,将被分给其他分片。
步骤4:采用First-Fit算法对每个偏斜分片的第二子集中键簇进行哈希分片的重新分配,并在重分配策略表STj中记录重分配的键簇的键以及所分配的哈希分片的索引号。具体执行步骤如下:
步骤4.1:将所有偏斜分配中第二子集Kredis的所有键簇按照权重大小降序排列,以及将所有哈希分片按照权重大小升序排列;
步骤4.2:令i=1,并判断按序第i个哈希分片的权重是否小于哈希分片的权重均值Wavg,若小于,执行步骤4.3;否则,执行步骤4.5;
步骤4.3:计算第i个哈希分片的剩余空间值rest,并依据键簇排列按序处理待分配的键簇;
F:判断第一个键簇的权重是否小于或等于剩余空间值rest,若所述,将所述键簇分配给第i个哈希分片,并更新剩余空间值;否则,暂不分配;
其中,若第i个哈希分片的索引号为p,权重为Wp,此时第i个哈希分片的剩余空间值rest的初始值等于哈希分片的权重均值Wavg与该哈希分片的权重Wp之差,即rest=Wavg-Wp。若将键簇分配给第i个哈希分片,此时更新后的剩余空间值rest=rest-ck,ck表示F中分配给第i个哈希分片的键簇权重。
G:按序判断下一个键簇的权重是否小于或等于更新后的剩余空间值rest,若是,将所述键簇分配给第i个哈希分片,并更新剩余空间值rest;否则,暂不分配;
其中,更新后的剩余空间值rest=rest-ck,ck表示G中分配给第i个哈希分片的键簇权重。
H:重复G步骤,直至所有的键簇均被判断处理过;
步骤4.4:判断是否还存在未被分配的键簇,若不存在,步骤4中所有的键簇分配完成;若存在,则i=i+1,并判断i是否满足i≤r,即是否还存在哈希分片未被处理;
若满足,判断第i个哈希分片的权重是否小于哈希分片的权重均值Wavg,若小于哈希分片的权重均值Wavg,再执行步骤4.3,若不小于,执行步骤4.5;
若不满足,执行步骤4.5;
步骤4.5:将未被分配的键簇按照权重大小降序排列,再将未被分配的键簇按照序列顺序依次分配给步骤4.1中升序排列的各个哈希分片。
如图2的第4步所示,原属于hash分片s的键簇ABCD均被分配给其他分片。比如,A被分给分片2,B被分给分片1,则将在重分配策略表STs中加入(A,2),(B,1)。而对于那些不需要重分配的键,比如EFG,重分配策略表STj不会记录它们的任何信息。重分配策略表STj只记录需要重分配的键的分配信息。
基于键簇分割的范围分片算法策略已经生成,则利用该分片策略对实际shuffle过程中的中间数据进行分片,对应于图2的策略应用阶段,即实际的shuffle分片阶段。分片策略生成过程并没有进行真正的中间数据分片,而是基于中间数据的键簇的分布信息来模拟分片,以此来预测实际的偏斜情况,指定键簇的重分配策略。在实际的shuffle过程中,对于中间数据中的每一个键值对,其获取reduce索引的具体过程如下步骤5-步骤6:
步骤5:利用哈希分片算法计算Map输出数据中每个键值对的reduce索引号,并分别判断偏斜分片表中是否存在每个键值对的reduce索引号,若存在,执行步骤6;否则,对应键值对的reduce索引号不变;
其计算方式为((key.hashcod+r)%r)。其中,key.hashcode表示key的哈希码,r表示reduce分片的数量。
步骤6:查找重分配策略表中是否存在对应键值对的键,若存在,根据重分配策略表获取所述键值对应的索引号;若不存在,对应键值对的reduce索引号不变。
应当理解,所谓对应键值对的reduce索引号不变即采用哈希分片算法计算的reduce索引号。
如图2的第5步所示,当前键为k。若键k=A,按hash方法计算其索引为s。首先查找Predis中是否包含s。因为s存在于Predis,继续查找A是否记录在STs中,因为记录了(A,2)的分配信息。所以得出最初A的分片索引号为2。
若键k=E,按hash方法计算其索引为s,查找到s存在于Predis中,然后查找STs是否包含E的分配信息,因为不存在E的信息,所以E按hash方法分片,即其分片索引为s。
若键k=J,按hash方法计算其索引为1,因为1未包含在Predis中,所以J直接按hash方法分配,其分片索引号为1。
为了便于理解,在此以一个简单的样例进行说明。
先预先指定分片的策略。假设键簇的权重分布为[(A,20),(B,40),(C,10),D(10)],要将其分为2个分片。若按照hash方法分配,则A和C属于分片0,C和D属于分片1。分片0和分片1的权重分别为30和50。计算分片均值Wavg为40,偏斜容忍度tol为1.2,偏斜阈值为48。分片1的权重大于48,因此其为一个偏斜分片,将其索引号1记录在Predis中。将分片1中的key分成两个部分,其中(B,40)保留在分片1,而(D,10)加入Kredis 1中。而后,将(D,10)分配给较轻的分片0,将(D,0)的映射关系记录在重分配策略表ST1中。
实际应用时,将分片的策略应用在实际的分片过程当中。假设当前进行分配的key为A,则计算其hash索引号0,因为Predis中不包含0,直接分配给分片0;假设key为B,其hash索引号为1,Predis中包含了1,但是重分配策略表ST1查找不到B的相应映射,则依然分配给分片1;假设key为D,其hash索引号为1,Predis中包含1,并且ST1中存在(D,0)的映射,则将其分配给分片0。
第二部分:针对需排序的Spark应用。
本发明针对需排序的Spark应用,生成基于键簇分割的范围分片算法策略,可以保证分片均匀,将介于分片之间的key cluster进行分割,分配到多个分片之中,有效地避免高频key导致的分片偏斜问题,提高Spark的执行效率。
基于键簇分割的范围分片算法策略的基本思想是将所有的键簇基于键key排序。然后,在序列中依次选择一些key作为分界点。分界点数量等于分片数量减一,比如,分片数量为r,选择的分界点依次为[0,1,…,bj-1,bj,…,br-3,br-2],一共r-1分界点,选择的依据是处在两个相邻的分界点之间的key cluster权重之和达到了分片均值。在实际分片过程中,假设键为k,满足bj-1<k≤bj,则k的分片索引号为j。但是,当数据中存在高频key,即keycluster的权重很大,这样的方法容易导致分片偏斜。基于key cluster分割的范围分片算法策略其分割了处在分界点的key,避免了高频key cluster导致的分片偏斜。该方法生成一个带权重的边界数组用于getPartition计算key的reduce索引。基于键簇分割的范围分片算法策略生成过程如下S1-S2:
S1:基于每个键簇的键按照Spark中的默认排序规则对键簇进行排序得到有序序列,再从有序序列中选择出分界点;
按照Spark中定义的默认的顺序进行排序。因为基于不同的数据类型会有不一样的排序方法。比如字符串按照字典顺序排序,就是类似a,b,c,d,…;数字就按照大小排序。至于是升序还是降序,就要按照应用的需求来,顺序与应用需求一致。如图3的第1步所示,若key clusters的键为A、B、C等,将其按键key排序,形成一个ABCDEFG…ST…的有序序列。并根据每个键簇的权重并计算出分片权重均值,分片权重均值等于每个键簇的权重之和除以分片数量。再将其作为分割步长step。
从有序序列中选择出分界点的过程如下e-f:
e:按照所述有序序列中键簇的键顺序依次累加键簇的权重直至得到的累加权重大于或等于分片权重均值,并获取当前键簇对应的节作为第一个分界点;
其中,若累加权重大于分片权重均值,将当前键簇的权重拆分为两个权重,第二个权重等于所述累加权重减去所述分片权重均值,且将第二个权重作为更新后的当前键簇的权重。第一个权重划入与分界点相邻的前一个分片。
f:再按照所述有序序列中键簇的键顺序依次累加位于前一个分界点之后的键簇的权重直至累加权重大于或等于分片权重均值,并将当前键簇对应的节点作为下一个分界点;
重复步骤f直至得到的分界点的数量等于分片数量减一。
其中,若步骤e或步骤f中累加权重大于分片权重均值,下一次执行步骤f时所述位于前一个分界点之后的键簇表示以权重更新后的当前键簇为起始点;
若步骤e或步骤f中累加权重等于分片权重均值,下一次执行步骤f时所述位于前一个分界点之后的键簇表示以当前键簇相邻的后一个键簇为起始点。
例如:若存在r个分片,则其包含r-1个分界点。首先选择分片0的分界点,该分片权重curW0初始为0。从序列的第一个key cluster开始,令当前key cluster权重为ck,若curW0+ck<step,更新curW0=curW0+ck,然后继续依次处理下一个key cluster;若达到curW0+ck≥step,则当前key为一个分界点。将当前key cluster的权重被分为两部分:(step-curW0)被分到分片0;(ck+curW0-step)被视作当前key cluster的新的权重,用于进行下一个分片的计算。
计算完分片0的分界点后,接着计算下一个分片的分界点。下一个分片的权重初始值为0,其计算从上一个分片的分界点key开始,注意此时的key cluster的权重已经不是ck而是(ck+curW0-step)。按上述分片0的方法依次计算完所有的分界点,得到带权重的边界表WB。最后一个分片的分界点不需要再计算。因为,第r-2个分区的分界点之后的key cluster都属于第r-1个分区。因此,分界点数量为分片数量减一。
S2:计算每个分界点的权重并将每个分界点的键以及每个分界点的权重记录在边界表中。
分界点的权重的计算公式如下:
式中,frctnj,k表示分界点的权重,cj表示所述分界点对应的当前键簇的权重中拆分的第一个权重,表示分界点对应的键簇的初始权重,j表示与分界点相邻的前一个分片,k表示分界点的键。
上述实例中,分界点的权重的计算公式要可以如下表示:
curWj表示分片j在累加过程中出分界点对应键簇划分的第一个权重外的所有键簇权重之和。
如图3的第2步所示,分片0的分界点key为D,其被分成两个部分,分别属于分片0和分片1,分界点D的权重为frctn0,D,将(D,frctn0,D)加入边界表WB。
生成分片策略后,将其具体应用于分片时,其过程如下:
S3:查找边界表中是否存在分界点对应的序列标记在有序序列中位于键值对的键所对应的序列标记之后;
若存在所述分界点,所述键值对的reduce索引号为所存在的分界点中与第一个分界点的相邻前一个分片的索引号;
若不存在所述分界点,查找边界表中是否存在分界点对应的序列标记与键值对的键所对应的序列标记相同,若存在,执行S4;若不存在,所述键值对的reduce索引号为最后一个分片的索引号;
S4:获取序列标记相同n个分界点以及所述分界点分割的n+1个分片,再随机生成一个小数u,并依据所述n个分界点的权重与小数u识别键值对所需分配的分片;
c:判断小数u是否小于或等于所述n个分界点中第i个分界点的权重,i=1;
若是,所述键值对的reduce索引号为所述n+1个分片中的第i个分片的索引号;若不是,执行步骤d:
d:更新i值,并判断更新后的i值是否小于或等于n,若是i小于或等于n,再判断所述小数u是否小于或等于所述n个分界点中前i个分界点的权重累加和;若是小于或等于前i个分界点的权重累加和,所述键值对的reduce索引号为所述n+1个分片中的第i个分片的索引号;否则,继续执行步骤d;
若是i大于n,所述键值对的reduce索引号为所述n+1个分片中的第n+1个分片的索引号;
其中,更新后的i值如下所示:
i=i+1。
当前分界点key等于k,则意味着k为分界点k,该k对应的键值对在实际分片过程中可能被分到不同的分片。比如图3中,策略生成阶段中,S被划分到三个分片r-3、r-2和r-1,存在两个分界点为S。策略应用阶段中,也就是在实际分片过程中,它的键值对会被分到分片r-3、r-2和r-1。因此,需要计算这次k被划分到哪一个分片。两个分界点S的权重分别为frctn(r-3),S和frctn(r-2),S。生成随机小数u,若u≤frctn(r-3),S,则将此次k分配给分片r-3;否则,继续累加下一个分界点S的权重,累加权重为u≤frctn(r-3),S+frctn(r-2),S,若u≤frctn(r-3),S+frctn(r-2),S,则分配给r-2;若u>frctn(r-3),S+frctn(r-2),S,则分配给r-1。
为了便于理解,在此以一个简单的样例进行说明。
在第一步中,先计算分片策略,也就是带权重的边界key数组。假设key cluster的权重分布按key的字典顺序排序为[(A,20),(B,10),(C,80),(D,40),(E,50)],分片数为4,则划分的步长为(20+90+40+50)/4=50。先计算分片0,依次将key clutser的权重相加,当加到B时,权重20+10=30小于50,当加到C时,权重之和30+80=110大于50,因此,C为一个边界key,其权重分为两个部分,一部分为20分给分片0,而剩下的60属于后面的分片。边界keyC的权重为20/80=0.25,将(C,0.25)加入带权重的边界key数组WB。然后,开始计算下一个分片1,此时key cluster C为60,大于步长50,因此对其再次拆分,将(C,0.625)加入WB中。接着计算分片2,因为C的剩余权重10加上D的权重40刚好等于步长,因此将(D,1)加入WB。至此,所有边界key计算完成。
在第二步中,将第一步得到的带权重的边界key数组[(C,0.25),(C,0.625),(D,1)]用于实际的中间数据分片当中。假设当前进行分配的key为A,因为A<C,则直接将其分配到分片0。假设key为C,因为存在边界key等于C,则生成一个随机小数u。若u为0.12,因为0.12<0.25,则分配到分片0;若u为0.45,因为0.25<0.45<0.25+0.625,则分配到分片1;若u为0.9,因为0.25+0.625<0.9,所以将其分配到分片2。假设key为E,因为D<E,直接分配给分片3。
需要强调的是,本发明所述的实例是说明性的,而不是限定性的,因此本发明不限于具体实施方式中所述的实例,凡是由本领域技术人员根据本发明的技术方案得出的其他实施方式,不脱离本发明宗旨和范围的,不论是修改还是替换,同样属于本发明的保护范围。