基于列存储的多核并行哈希分区优化方法

文档序号:6621938阅读:161来源:国知局
基于列存储的多核并行哈希分区优化方法
【专利摘要】本发明公开了一种基于列存储的多核并行哈希分区优化方法,主要解决现有并行哈希分区算法不能高效利用多核处理器资源的问题。其实现方案是:首先,利用映射-化简并行编程模型将数据分区任务动态分配到各个核来执行,根据列存储数据集存储结构的不同,选择相应的避免写冲突策略;然后,用映射线程进行第一次哈希划分,并将所得到的第一次哈希分区结果经过数据倾斜优化后交给化简进程进行第二次哈希分区;最后,返回最终的哈希分区结果。本发明很好的利用了在多核处理器上任务可并行执行的特性,并能够适应各种分布的输入数据,提高了高速缓存效率和多核处理器的整体性能,可用于列存储数据集的多核并行多步哈希分区。
【专利说明】基于列存储的多核并行哈希分区优化方法

【技术领域】
[0001]本发明属于数据处理【技术领域】,特别涉及一种多核并行哈希分区优化方法,可用于列存储数据库的数据分区。

【背景技术】
[0002]分区是数据库中的重要操作,同时也是其他数据库操作的基本操作,例如:连接、聚集、排序等操作。分区是将一个较大的任务分成若干个较小的子任务。处理若干个子任务所用的总时间常常小于处理一个较大任务所用的时间,这是因为较小的任务能够高效的利用缓存和内存。分区操作在不同的应用中已经有了大量的研究,这些研究主要是针对数据库操作。在连接操作和聚集操作中,分区能够明显的提升其性能;在并行排序操作中,分区也是其中重要的一步。Manegold等人提出的Radix_cluster分区算法通过减少缓存丢失和快表丢失获得了较好的效果。Cieslewicz等人提出了在多核处理器中并行分区的方法,在处理均匀分布的输入数据时取得了较好的效果。
[0003]HASH分区主要用来分散热点读,确保数据在预先确定个数的分区中尽可能平均分布。传统HASH分区方式通过取模的方式使数据尽可能平均分布在每个分区中,让每个分区管理的数据都减少,提高查询的效率;可是当需要增加分区或者合并分区的时候,就会出现问题。假设原来是5个常规HASH分区,现在需要新增一个常规HASH分区,原来的取模算法是M0D(eXpr,5),根据余数O?4分布在5个分区中,现在新增一个分区后,取模算法变成M0D(expr, 6),根据余数O?5分区在6个分区中,原来5个分区中的数据大部分都需要通过重新计算重新分区。
[0004]伴随当今的硬件发展十分迅速,CPU拥有更多的核心,每个核心拥有更多的线程。常见的CPU拥有4个或者更多的核心,每个核心拥有2个或者更多的线程。最近,IBM推出了新一代的P0WER8处理器,支持12核心96线程,共享96MB的三级缓存,这说明多核CPU有广阔的应用前景。面对新型的硬件架构,传统的并行哈希分区算法不能高效地利用多核处理器的并行资源,且不能较好地处理有倾斜的输入数据。


【发明内容】

[0005]鉴于现有技术的不足,本发明的目的是克服上述传统哈希分区方法的两个缺陷,采用多核处理器,利用线性哈希分区技术和基于映射-化简模型的单CPU多核处理器并行技术,动态地将要分区的列存储数据集加载到内存,并使用映射-化简模型将分区操作分配到处理器的多个核上并行运行,以缩短大数据集分区结果的返回时间,提高数据分区的效率,并较好地处理了有倾斜的输入数据。
[0006]实现本发明目的的技术思路是:采用映射-化简框架在多核处理器环境下对列存储数据集进行哈希分区,并在映射-化简执行时将列存储数据集均匀分为若干块,通过映射-化简模型将各个块分配给不同的映射线程并行执行,通过选择合适的策略避免写冲突,进行第一次映射线程哈希分区,再将所得到的中间结果集进行数据倾斜优化后作为输入进行第二次化简线程哈希分区,以实现列存储数据集的多核并行哈希分区。
[0007]根据上述思路本发明的实现步骤包括如下:
[0008](I)读取用户输入的列存储数据集,该列存储数据集的数据格式为(Key,Value)形式的键值对,其中Key表示键值对所对应的编号,Value表示键值对所存储的值;
[0009](2)将用户输入的列存储数据集分割为若干大小相同的块,并将每一块数据交给一个映射线程进行第一次哈希分区;
[0010](3)对于列存储数据集不同的哈希存储结构,选择相应的避免写冲突策略,以确保第一次哈希分区时映射线程的并行执行;
[0011](4)通过映射线程并行执行第一次哈希分区,产生m个一次哈希分区结果:







HashBi ts
[0012](4a)设映射线程的映射哈希函数为' (Key) =Key mod T一^一其中HashBits
是用户自定义的哈希参数,其取值范围为[2,+⑴),mod为模运算,L I为向下取整运算;
[0013](4b)每个映射线程依据映射哈希函数(Key),对于列存储数据集(Key, Value)键值对中的Key值进行哈希运算,将运算结果相同的键值对分到同一个分区中,共产生m个一次哈希分区,其大小分别为D1, D2,...,Di,..., Dm, i e I, 2,…,m,m彡2 ;
[0014](5)将产生的m个分区结果通过化简进程进行第二次哈希分区:







H<ishBi ts
[0015](5a)设化简线程的化简哈希函数为:& (Key)= Key mod 2,其中「I为向上取整运算;
[0016](5b)通过数据倾斜优化方法优化m个一次哈希分区结果,将数据倾斜优化后的分区结果交给m个化简线程进行分区,即由化简线程依据化简哈希函数f2 (Key),对每个分区结果(Key,Value)键值对中的Key值进行哈希运算,再将运算结果相同的键值对分到同一个分区中,分别产生η个分区结果,η彡2,共产生mXn个二次哈希分区,mXn ^ 4 ;
[0017](6)将最终的mXη个分区结果输出给用户。
[0018]本发明具有如下优点:
[0019]1.本发明基于多核处理器可并行执行的特性,利用映射-化简模型,将列存储数据集分为若干块交给线程进行并行处理,实现多步并行的哈希分区,提高了高速缓存效率,从而使多核处理器的整体性能得到提升;
[0020]2.本发明根据列存储数据集两种的不同存储结构,选择四种避免线程写冲突策略,解决了各线程之间并行写入数据集到同一分区位置时的写冲突;
[0021]3.本发明对有数据倾斜的列存储数据集提出数据倾斜优化方法,实现了对各种分布的输入数据集的哈希分区。

【专利附图】

【附图说明】
[0022]图1为本发明的运行流程示意图;
[0023]图2为本发明利用映射-化简模型执行多步哈希分区示意图;
[0024]图3为传统的哈希存储结构图;
[0025]图4为本发明优化的哈希存储结构图;
[0026]图5为本发明进行第二次哈希分区前使用数据倾斜优化方法的流程示意图;
[0027]图6为用本发明在无锁策略下分别进行单步分区与多步分区的效率对比图;
[0028]图7为用本发明在四种不同策略下分别进行单步分区的效率对比图;
[0029]图8为用本发明在两次遍历策略下使用数据倾斜优化与未使用数据倾斜优化分别进行分区的效率对比图。

【具体实施方式】
[0030]为了更好的理解本发明,下面将结合附图对本发明进行详细的说明。
[0031]参照图1,本发明的实现步骤如下:
[0032]步骤1,读取列存储数据集。
[0033]将用户所输入的列存储数据集保存在一个txt的文本文件中,每个键值对占txt文本文件的一行;
[0034]通过读取txt文件每一行读取用户输入的列存储数据集,该列存储数据集数的数据格式为(Key,Value)形式的键值对,其中每对键值对大小16字节,含有8字节的编号Key和8字节存储的值Value ;
[0035]对读取的列存储数据集选择传统的哈希存储结构或者优化的哈希存储结构进行存储。
[0036]步骤2,分割用户输入的列存储数据集。
[0037]将用户输入的列存储数据集分割为t个大小相同的块,如图2中的分块所示,数据集分块数目t应当等于映射线程的数目,其中t e 2,3,4,…;
[0038]依据用户输入数据集大小C和数据集分块数目t计算每一块数据集的大小f,映射线程依据每块数据集的大小从总的数据集中取出数据。
[0039]步骤3,选择并行分区时的避免写冲突策略。
[0040]依据存储用户输入数据集时所选择的哈希存储结构,对列存储数据集不同的哈希存储结构,选择相应的避免写冲突策略,以确保第一次哈希分区时映射线程的并行执行,其选择原则如下:
[0041]原则一,对于存储数据集采用传统的哈希存储结构,即用一个容器或者数组存储键值对,则选择使用两次遍历策略或并行缓存策略,以避免写冲突;
[0042]原则二,对于列存储数据集采用优化的哈希存储结构,则选择使用加锁策略或无锁策略,以避免写冲突。
[0043]所述传统的哈希存储结构,是用一个容器或者数组存储键值对;当用一个容器存储某一个分区中的键值对时,由于用容器存储键值对时只能通过顺序遍历找到该容器空闲的存储位置,然后进行写入操作,随着键值对数目的增加,键值对的存储效率会明显降低;当用一个数组存储某一个分区中的键值对时,其结构如图3所示,哈希存储结构由一个指针数组组成,该指针数组中的每一个指针指向一个新的数组,用于存储键值对,由于数组可以通过下标进行定位,数组存储键值对的存储效率较高且存储效率不会随着存储键值对的数目的增加而降低,但初始化一个容量较大的数组所需时间较长。
[0044]所述优化的哈希存储结构,其结构如图4所示,用一个连续的数组表示,数组的每一位表示一个哈希桶,每一个哈希桶存储结果集中某一个分区中的键值对。每一个哈希桶由空闲指针(free指针),后继指针(next指针)和一段连续的存储空间组成,其中连续的存储空间用于存储键值对,free指针指向该连续存储空间中下一个空闲位置,next指针指向新的哈希桶位置,这样的设计既保证了键值对存储效率又降低了初始化存储结构时的花销;
[0045]所述的两次遍历策略,是指先通过线程进行第一次遍历,将每个线程分区所产生的各分区中键值对个数存储到二维数组Km,其中q表示线程的编号,P表示该线程分区所产生的分区编号;然后通过公式=计算出第q个线程的第P个分区中键值对写入


J=I 克=1
存储结构的位置;最后进行第二次遍历,将键值对并行写入分区区域存储结构;该策略最终的分区结果存储在一段连续的存储空间,提高了程序的局部空间利用率,但该策略对输入的数据集要进行两次遍历;
[0046]所述的并行缓存策略,是指每个线程有大小一定的独立存储空间,将键值对写入线程自己的存储空间时不需要进行加锁解锁操作,但当该存储空间耗尽时,需要通过加锁解锁操作获取新的存储空间;
[0047]所述的加锁策略,是指所有线程共享一个键值对存储结构,每一个分区区域是一个连续的存储空间,每个线程并行地将键值对写入分区区域,当不同线程写入同一分区区域时,需要先对该分区区域进行加锁操作,然后加锁线程进行写入;加锁线程将键值对写入完毕后需要进行解锁操作,并由另一个线程加锁该分区区域进行写入,直至所有线程执行完毕,使用该策略进行哈希分区时内存消耗较小,且内存消耗不会随着线程数目的增加而增加,但频繁的加锁解锁操作影响了哈希分区的整体效率;
[0048]所述的无锁策略,是指每个线程有一个独立的键值对存储结构,每个线程只将数据写入自己的存储结构中,避免频繁的加锁解锁操作,但该策略需要额外的操作将所有线程分区所产生的存储结构进行合并,同时进行哈希分区时的内存消耗会随着线程数目的增加而增加。
[0049]步骤4,映射线程进行第一次哈希分区。
[0050]映射线程依据所选择的避免写冲突策略利用映射哈希函数并行执行第一次哈希分区,产生m个分区结果:







I HashBi ts
[0051](4a)设映射线程的映射哈希函数为:士' (Key) =Key mod 一2一其中HashBits
是用户自定义的哈希参数,其取值范围为[2,+⑴),mod为模运算,L」为向下取整运算;
[0052](4b)每个映射线程依据映射哈希函数(Key),对于列存储数据集(Key, Value)键值对中的Key值进行哈希运算,将运算结果相同的键值对分到同一个分区中,共产生m个一次哈希分区,其大小分别SD11Df1Df1Dm, i e l,2^",m,m>2。
[0053]步骤5,将产生的m个分区结果交给化简线程,进行数据倾斜优化和第二次哈希分区。
[0054](5a)设化简线程的化简哈希函数为:& (Key)= Key fflod 2,其中「]为向上取整运算;
[0055](5b)通过数据倾斜优化方法优化m个一次哈希分区结果:
[0056]参照图5,本步骤的具体实现如下:
[0057](5bl)设定一个阈值T=2 X -;




Hl
[0058](5b2)将m个一次哈希分区D1, D2,...,Di,...,Dm依次与阈值T进行比较:
[0059]若Di < T,则将该哈希分区直接交给化简线程;
[0060]若DiXT,则将该哈希分区暂时保存到队列D中,直至所有一次哈希分区全部比较完毕,再将队列D中的每一个哈希分区平均分为m份,将每一份分别交给一个化简线程。
[0061](5c)化简线程依据化简哈希函数对优化后的分区结果进行第二次哈希分区,即依据化简哈希函数(Key),对每个分区结果(Key, Value)键值对中的Key值进行哈希运算,再将运算结果相同的键值对分到同一个分区中,分别产生η个分区结果,η >2,共产生mXn个二次哈希分区,mXn彡4。
[0062]步骤6,将最终的mX η个分区结果输出给用户。
[0063]最终的mXn个分区结果通过txt文件形式输出给用户,同时进行本次哈希分区所用的初始化时间、第一次分区时间、第二次分区时间以及总时间均将输出给用户,用户依据上述时间参数对哈希分区的效率进行评定。
[0064]下面将结合具体实验对本发明的效果作进一步描述。
[0065]一、实验环境
[0066]在Linux系统中用C++编程语言,基于英特尔新型Sandy Bridge架构的Xeon8核处理器(E5-26702.6GHZ)共用4个8GB DDR3内存进行分区,每核包含两个线程、拥有3个级别的缓存,其中I级缓存为独立的32KB,2级缓存为独立的256KB,3级缓存为共享的20M。
[0067]二、实验内容
[0068]实验1,在无锁策略下比较单步分区与多步分区的效率。
[0069]本实验中,用户输入的列存储数据集为16M,共16384对键值对,对输入数据集采用优化的哈希存储结构进行存储,映射线程的线程数为16,即将输入数据集均分为16个含有1024对键值对的数据集,取多个哈希函数参数HashBit,在无锁策略下分别进行单步哈希分区与多步哈希分区,结果如图6所示。
[0070]从图6可见,当HashBits较小时,由于分区结果中键值对较少,能够较好地利用高速缓存和快表,而多步分区相比单步分区要多进行一次分区,因此单步分区的效率比多步分区要高。
[0071]当HashBits较大时,由于分区结果中键值对较多,高速缓存和快表未命中的几率增加,多步分区能够将分区结果中较多的键值对通过第一次分区使得分区结果中键值对数目减少,因此多步分区比单步分区效率更高,当多步分区中第一次分区数目等于第二次分区数目时,多步分区效果最好。
[0072]实验2,比较四种不同策略的下单步分区的效率。
[0073]本实验中,用户输入的列存储数据集为16M,共16384对键值对,使用加锁策略和无锁策略进行分区时,输入数据集采用优化的哈希存储结构进行存储,使用两次遍历策略和并行缓存策略进行分区时,输入数据集采用传统的哈希存储结构进行存储,映射线程的线程数为16,即将输入数据集均分为16个含有1024对键值对的数据集,取多个哈希函数参数HashBit,通过映射线程进行单步哈希分区,结果如图7所示。
[0074]从图7可见,在加锁策略中,当HashBits较小时,每一个分区结果有较多的键值对,频繁加锁解锁操作会影响整体性能。随着HashBits的增加,每一个分区结果的键值对数目减少,线程之间的冲突减少,整体性能提升。当HashBits继续增加,高速缓存和快表的未命中会影响程序效率。
[0075]在无锁策略中,由于没有加锁解锁操作,在HashBits较小时程序性能大大优于加锁策略,但程序需要许多额外的变量记录当前写入位置、分区大小等信息,而这些变量的数目随着线程数目的增加而增加,所以随着HashBits的增加,无锁策略承担的内存压力增力口,再考虑到高速缓存和快表未命中的影响,随着HashBits的增加,程序整体效率明显下降。
[0076]在两次遍历策略中,受限于第一次遍历计算分区键值对写入位置的操作,当HashBits增加时,分区数目增多,第一次遍历需要计算的写入位置数目也随着增加,该策略的整体效率就降低。
[0077]在并行缓存策略中,随着HashBits的增加,考虑到高速缓存和快表未命中的影响,程序整体效率明显下降。
[0078]实验3,对含有数据倾斜的输入数据集在两次遍历策略下比较使用数据倾斜优化与未使用数据倾斜优化进行分区的效率。
[0079]本实验中,用户输入的列存储数据集为16M,共16384对键值对,用户输入的数据集是有数据倾斜的数据集,其倾斜度的齐夫值为1.15,对输入数据集采用传统的哈希存储结构进行存储,映射线程的线程数为16,取多个哈希函数参数HashBit,比较在两次遍历策略避免下使用数据倾斜优化数据集与不使用数据倾斜优化数据集进行分区的效率,其结果如图8所示。
[0080]从图8可知,在多步分区处理有数据倾斜的输入数据时,使用本发明提出的优化方法比未使用优化方法的性能有了明显的提高。这是因为本发明提出的优化方法将较大的数据集暂时保存延后进行处理,先并行分区较小的数据集避免多个空闲线程等待一个工作线程的情况,对较大的数据集进行均分后再由线程进行并行分区,因此在有数据倾斜的输入数据情况下,可以有效的提高整体分区性能。
【权利要求】
1.一种基于列存储的多核并行哈希分区优化方法,其特征在于,包括以下步骤: (1)读取用户输入的列存储数据集,该列存储数据集的数据格式为(Key,Value)形式的键值对,其中Key表示键值对所对应的编号,Value表示键值对所存储的值; (2)将用户输入的列存储数据集分割为若干大小相同的块,并将每一块数据交给一个映射线程进行第一次哈希分区; (3)对于列存储数据集不同的哈希存储结构,选择相应的避免写冲突策略,以确保第一次哈希分区时映射线程的并行执行; (4)通过映射线程并行执行第一次哈希分区,产生m个一次哈希分区结果:






MashBi ts.(4a)设映射线程的映射哈希函数为..a (Key) =Key mod 一_2一其中HashBits是用户自定义的哈希参数,其取值范围为[2,+⑴),mod为模运算,L I为向下取整运算; (4b)每个映射线程依据映射哈希函数(Key),对于列存储数据集(Key, Value)键值对中的Key值进行哈希运算,将运算结果相同的键值对分到同一个分区中,共产生m个一次哈希分区,其大小分别为D1, D2, - ,Di, - ,Dm, i e 1,2,彡2 ; (5)将产生的m个分区结果通过化简进程进行第二次哈希分区: (5a)设化简线程的化简哈希函数为:^ (Key)= Rey mod 2?^^其中「I为向上取整运算; (5b)通过数据倾斜优化方法优化m个一次哈希分区结果,将数据倾斜优化后的分区结果交给m个化简线程进行划分,即由化简线程依据化简哈希函数f2 (Key),对每个分区结果(Key, Value)键值对中的Key值进行哈希运算,再将运算结果相同的键值对分到同一个分区中,分别产生η个分区结果,η彡2,共产生mXn个二次哈希分区,mXn彡4 ; (6)将最终的mXn个分区结果输出给用户。
2.根据权利要求1所述的基于列存储的多核并行哈希分区优化方法,其特征在于,步骤(3)所述对于列存储数据集不同的哈希存储结构,选择相应的避免写冲突策略,按如下原则选择: 若列存储数据集采用传统的哈希存储结构,即用一个容器或者数组存储键值对,则选择使用两次遍历策略或并行缓存策略,以避免写冲突; 若列存储数据集采用优化的哈希存储结构,则选择使用加锁策略或无锁策略,以避免与冲突; 所述优化的哈希存储结构,是用一个连续的数组表示,数组中的每一位表示一个哈希桶,每一个哈希桶由free指针,next指针和一段连续的存储空间组成,其中连续的存储空间用于存储键值对,free指针指向该连续存储空间中下一个空闲位置,next指针指向新的哈希桶位置。
3.根据权利要求2所述基于列存储的多核并行哈希分区优化方法,其中所述的两次遍历策略,是指先通过线程进行第一次遍历,将每个线程分区所产生的各分区中键值对个数存储到二维数组Km,其中q表示线程的编号,P表示该线程分区所产生的分区编号;然后通过公式£ ?晃k计算出第q个线程的第P个分区中键值对写入存储结构的位置;最后

^/=1 k =1进行第二次遍历,将键值对并行写入分区区域存储结构。
4.根据权利要求2所述基于列存储的多核并行哈希分区优化方法,其中所述的并行缓存策略,是指每个线程有大小一定的独立存储空间,将键值对写入线程自己的存储空间时不需要进行加锁解锁操作,但当该存储空间耗尽时,需要通过加锁解锁操作获取新的存储空间。
5.根据权利要求2所述基于列存储的多核并行哈希分区优化方法,其中所述的加锁策略,是指每个线程并行地将键值对写入分区区域,当不同线程写入同一分区区域时,需要先对该分区区域进行加锁操作,然后加锁线程进行写入;加锁线程将键值对写入完毕后需要进行解锁操作,并由另一个线程加锁该分区区域进行写入,直至所有线程执行完毕。
6.根据权利要求2所述基于列存储的多核并行哈希分区优化方法,其中所述的无锁策略,是指每个线程有一个独立的键值对存储结构,每个线程只将数据写入自己的存储结构中,避免频繁的加锁解锁操作。
7.根据权利要求1所述的基于列存储的多核并行哈希分区优化方法,其特征在于,步骤(5b)所述通过数据倾斜优化方法优化m个一次哈希分区结果,按如下步骤进行: (5bl)设定一个阈值T=2 X 一,其中C表不输入列存储数据集的大小;

m (5b2)将m个一次哈希分区D1, D2,...,Di,...,Dm依次与阈值T进行比较: 若Di < T,则将该哈希分区直接交给化简线程; 若DiXT,则将该哈希分区暂时保存到队列D中,直至所有一次哈希分区全部比较完毕,执行步骤(5b3);(5b3)将队列D中的每一个哈希分区平均分为m份,将每一份分别交给一个化简线程。
【文档编号】G06F17/30GK104133661SQ201410369674
【公开日】2014年11月5日 申请日期:2014年7月30日 优先权日:2014年7月30日
【发明者】黄鑫, 刘志镜, 袁通, 刘慧 , 王梓, 徐曾, 强波, 李宗利, 邱龙滨, 王鹏 申请人:西安电子科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1