面向数据流的低时延内存B+树索引构建方法与流程

文档序号:13147019阅读:337来源:国知局
技术领域本发明涉及一种快速流数据低时延内存B+树索引构建方法,特别是一种面向流数据基于时间窗口的高吞吐、低时延内存B+树索引构建方法。

背景技术:
近年来,数据流的应用越来越广泛。典型的数据流包括传感网感知数据、股价数据、网络监控数据、交通监控系统的监测数据、电信通话记录以及Web点击流。数据流是由流元组构成的一个无限的有序序列。本发明中流元组的形式为<timeStamp,dataTuple>,其中“timeStamp”指流元组的时间戳,“dataTuple”指数据元组,与监控对象有关的具体检测数据。与传统的数据管理不同,数据流具有以下的特点:(1)数据流连续、实时到达;(2)数据流的潜在规模是无限的;(3)系统无法控制数据流到达的速率和元组的顺序;(4)数据流一经处理,除非特意保存,否则难以再次处理。传统数据库管理系统在处理规模有限、数据更新频率相对低的数据集合时具有良好的性能;但面对数据流更新持续且频繁,在很短时间内(秒级)要处理大量的数据更新,传统数据库无法维持这样的更新频率。流数据处理方面已有大量的研究工作。研究人员设计了一些适用于数据流处理的系统,如斯坦福大学的STREAM系统,加州大学伯克利分校的TelegraphCQ系统,麻省理工学院、布朗大学和布兰代斯大学联合研发的Aurora系统。上述流数据库系统目的是用于支持在线数据的静态查询、连续查询、近似计算等,不在磁盘上保存整个数据流,仅保存查询结果(如数据聚集)。这些系统通常提供了支持流数据操作的类SQL语言。近几年,数据流应用不再局限于流数据实时处理的速度和查询结果的精确度方面的高要求,这些应用也拓广到海量流数据的深度分析上,对数据流的实时存储提出了要求。而上述数据流管理系统没有关注数据流的实时存储问题。数据实时性、突发性、无限性的特点对数据流的存储速度提出了很高的要求。数据流的实时存储涉及到数据流上实时构建合适的索引,方便后续即席查询操作。有研究人员对网络数据包流的特殊应用提出了一种实时位图索引,针对传感器网络中异构数据流构建位图索引。上述工作针对特定的数据流应用提出的索引构建方法,还无法涵盖各种场景。重要场景之一是基于时间窗的数据流,如交通数据流,需要对不同时间段的数据进行处理,具有实时性强、速度快,构建索引面对这方面的应用需求,解决不同时间窗内的数据查询处理、分析、持久化具有重要应用价值的。本文所提方法可以解决这方面的问题。

技术实现要素:
本发明要克服现有技术的上述缺点,适应流数据实时性、快速、无限连续的特点,提出一种基于时间窗口批处理、多核计算方法提出快速流数据内存B+树构建方法,该方法具有建树效率高、数据吞吐量大的特性。根据应用需要,设定数据接收窗口时间长度,每个时间窗对应一个时间戳,对窗口中的数据进行批量构建部分索引(一棵子树),然后在全局B+树上插入对应该窗口时间戳的键值,并把对应于该窗口的子树挂接到全局B+树中该键值所对应指针上。本发明的面向流数据基于时间窗口的高吞吐、低时延内存B+树索引构建方法包括以下步骤:1)负责接收数据的节点机采用双缓存机制,每个开始接收数据的缓存对应一个时间窗并有相应的时间戳标记winTime;当其中一个时间窗时间到期后,进行相应处理,并启动另一个缓存对应的缓存用于接收后续到达的数据,如此往复。在某个给定时间窗完成流数据接收时(该窗口到期),假设对应该窗口构建好的子树根节点指针rootPtr,以winTime为键值,将元组<winTime,rootPtr>插入到全局B+树上;2)步骤1)中时间窗口中接收的流式元组数据以健-值(Key-Value)格式缓存到KVArray数组中;3)根据窗口时间区间将窗口数据进行等时间分片,每个数据分片接收完成后进行排序,然后与之前排序好的数据进行归并排序;4)同时,若当前窗口流式数据接收时间已达规定时长,则获取当前窗口数据元组数W。设B+树内部节点默认最大容量(最大子节点数)为B,计算以下参数:(4.1)子B+树的层数H,满足:BH-1<W≤BH(4.2)子B+树内部节点的子节点数mm=W/BH-1]]>(4.3)内部节点数NiNodes,(4.4)叶子节点数NleafNodes,NleafNodes=mH-1(4.5)叶子节点的子节点数d:d=W/NleafNodes(4.6)叶子节点的子节点数偏移量dindex,即前dindex个叶子节点的子节点数多一个,使构建的B+树均衡:dindex=W%NleafNodes5)进行树结构初始化:(5.1)初始化节点数组BNodeArray,该数组长度为NiNodes+NleafNodes;其中NiNodes为内部节点数,NleafNodes为叶节点数,内部节点中最后一个节点为根节点;(5.2)将根节点指向节点数组最后一个元素;6)启用多线程构建叶子节点,共构建NleafNodes个节点,每个叶子节点构建相对独立。构建叶子节点需要计算三部分数据:父节点相关数据、本节点相关数据、子节点相关数据,并进行相应的引用连接操作,即将孤立的节点通过指针指向其父节点及子节点,从而形成树结构。下面以构建第lfindex叶子节点为例进行说明:(6.1)计算父节点相关数据,计算父节点在节点数组BNodeArray的下标lpindex:lpindex=NleafNodes+lfindex/m(6.2)计算本节点相关数据,所属层数lflevel,叶子节点属于最底层,层数即为树的层数H,lflevel=H(6.3)计算子节点相关数据:(6.3.1)计算子节点在数组KVArray中的起始下标lfcsindex。在满足lfindex≤dindex时:lfcsindex=lfindex×d+lfindex;在满足lfindex>dindex时,lfcsindex=lfindex×d+dindex;(6.3.2)计算叶子节点的子节点数NlfcNodes。在满足lfindex≤dindex时,NlfcNodes=d+1;在满足lfindex>dindex时,NlfcNodes=d;(6.4)构建叶子节点,并将子节点通过引用方式将元组数组连接到叶子节点;7)启用多线程构建内部节点,共构建NiNodes个节点,每个叶子节点构建相对独立。构建内部节点需要计算三部分数据:父节点相关数据、本节点相关数据、子节点相关数据,并进行相应的引用连接操作,即将孤立的节点通过指针指向其父节点及子节点,从而形成树结构。下面以构建第iindex叶子节点为例进行说明:(7.1)计算内部节点的相关数据;(7.1.1)计算内部节点所属层数ilevel,满足以下条件;Σi=ilevelH-1mi≤iindex-NleafNodes<Σi=ilevel-1H-1mi]]>(7.1.2)计算内部节点在所在层数的次序ilevelindex:ilevelindex=iindex-Σi=ilevelHmi]]>(7.2)计算父节点在数组BNodeArray的下标ipindex:ipindex=Σi=ilevelHmi+ilevelindex/m]]>(7.3)计算内部节点的子节点相关数据;(7.3.1)计算内部节点的子节点在数组KVArray中的起始下标icsindex:icsindex=Σi=ilevel+1Hmi+ilevelindex×m]]>(7.3.2)计算内部节点的子节点数NicNodes:NicNodes=m(7.4)在进行引用连接操作前,须判断所有子节点是否已经完成构建,若已经完成构建,则可以开始引用连接操作。本发明技术构思是将快速B+树内存索引构建成双层树结构,其中上层构建全局B+树索引,采用插入法将已接收窗口的时间戳winTime为键值,以该窗口数据构建的B+树根节点rootPtr为值,将<winTime,rootPtr>元组挂接到全局B+树索引上;由于时间窗的时间戳是递增的,因此,<winTime,rootPtr>元组的插入操作中只需在最右边的树枝上进行,可以做相应优化处理,最右分枝构建中,其节点的饱和度不受传统B+树的约束,从而不必进行节点分裂操作。在构建窗口数据的局部B+树中,采用新颖的建树方法构建子B+树索引,建树分成三大步骤:数据接收阶段、排序阶段、建树阶段。在构建树阶段,将构建树阶段分成计算树结构阶段和构建树节点阶段,通过计算树结构,获得构建树所用的空间情况及树结构情况,进而通过统一申请、分配空间,使树的地址空间连续;在计算树结构的基础上并行构建相对独立的树节点,提高建树效率。在数据接收阶段,边接收数据边排序,将排序与接收数据并行;在排序阶段进行赋值交换,在构建树阶段进行引用操作,实现排序与树构建并行。实现排序与数据接收并行,排序与树构建并行,将建树的三大主要操作并行,降低建树时延,提高建树效率,从而提高计算机处理效率,提高数据吞吐量。本发明的优点是:高吞吐量、低时延、高空间利用率。附图说明图1是本发明的双层B+树索引结构图;图2是本发明的构建窗口子树的时间重叠、分布图;图3是本发明的窗口子树结构所涉及的数据结构示意图;图4是本发明的窗口子树结构示意图;图5是本发明的方法流程图。具体实施方式下面结合附图进一步说明本发明。参照图1、2、3、4。面向流数据基于时间窗口的高吞吐、低时延多线程低时延内存B+树索引构建方法,包括以下步骤:1)通过时间窗接收数据,时间窗时间到期后,完成窗口对应子树的构建,子树根节点指针rootPtr。以时间窗口时间戳winTime为键值,将元组<winTime,rootPtr>插入到全局B+树上;2)在步骤1)中实时接收窗口流式数据,将接收的流式元组数据以<Key,Value>形式缓存到KVArray数组中;3)根据窗口时间将窗口数据进行等时间分片,每个分片数据接收完成后进行排序,然后与之前排序好的数据合并,排序过程中值交换采用赋值交换;4)同时若窗口流式数据接收完毕,即获取当前窗口数据量W,计算以下参数(默认最大子节点数为B):(4.1)层数H;(4.2)内部节点的子节点数m;(4.3)内部节点数NiNodes;(4.4)叶子节点数NleafNodes;(4.5)叶子节点的子节点数d;(4.6)叶子节点的子节点数偏移dindex,即前dindex叶子节点的子节点数多一个,使构建的B+树均衡。5)待参数计算完毕,进行树结构初始化:(5.1)初始化节点数组BNodeArray,节点数组长度为NiNodes+NleafNodes;其中前NleafNodes为子节点,后NiNodes为内部节点,内部节点中最后一个节点为根节点;(5.2)将根节点指向节点数组最后一个元素;6)启用多线程构建叶子节点,共构建NleafNodes个节点,每个叶子节点构建相对独立,下面以构建第lfindex叶子节点为例进行说明:(6.1)构建叶子节点需要计算三部分数据:父节点相关数据、本节点相关数据、子节点相关数据,并进行相关的引用连接操作;(6.2)计算父节点相关数据;(6.2.1)计算父节点在BNodeArray数据的下标lpindex:(6.3)计算本节点所属层数lflevel,(6.4)计算子节点相关数据;(6.4.1)计算子节点在KVArray数组中的起始下标lfcsindex;(6.4.2)计算叶子节点的子节点数NlfcNodes;(6.5)构建叶子节点,并将子节点通过引用方式连接将元组数组连接到叶子节点;7)启用多线程构建内部节点,共构建NiNodes个节点,每个叶子节点构建相对独立,构建内部节点需要计算三部分数据:父节点相关数据、本节点相关数据、子节点相关数据,并进行相关的引用连接操作。下面以构建第iindex叶子节点为例进行说明:(7.1)计算内部节点相关数据;(7.1.1)计算内部节点所属层数ilevel;(7.1.2)计算内部节点在所在层数的次序ilevelindex;(7.2)计算内部节点的父节点在数组BNodeArray的下标ipindex:(7.3)计算子节点相关数据;(7.3.1)计算内部节点的子节点在数组KVArray中的起始下标icsindex;(7.3.2)计算内部节点的子节点数NicNodes(7.4)在进行连接操作前,须判断所有子节点是否已经完成构建,若已经完成构建,则可以开始连接操作。本说明书实施例所述的内容仅仅是对发明构思的实现形式的列举,本发明的保护范围不应当被视为仅限于实施例所陈述的具体形式,本发明的保护范围也及于本领域技术人员根据本发明构思所能够想到的等同技术手段。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1