本发明属于大数据流式处理技术领域,更具体地,涉及一种基于多级缓存结构的流式数据实时处理方法及系统。
背景技术:
idc报告显示,预计到2020年全球数据总量将超过40zb,且全球的数据量以每年58%的速度增长,这个速度还在不断加快,其中很大一部分数据是由传感网络、社交网络、web浏览等产生的流式数据,该数据具有实时性、易失性、突发性、随机性、无限性等特征,需要高效、快速、可靠地处理流式数据,并将处理结果实时输出或实时查询。
在数据处理方面。针对流式数据的特点,大致可以分为三种处理框架:1、纯流式处理框架,如jstorm、storm等,其定义由bolt和spout组成的任务拓扑结构会以元组形式不断处理高速到达的数据流,其处理延迟低,但吞吐率和可靠性较低;2、面向批的流式处理框架,如sparkstreaming、sss-mapreduce、muppet等,其首先将流式数据聚合成微小的批,然后再进行处理,由于处理前需要等待数据聚合成批,因此其处理延迟相对于纯流式处理框架较高;3、混合处理框架,如lambda、summingbird等,其分为批量层、在线层、服务层,批量层使用批量处理,如mapreduce;在线层使用流式处理,如storm;其结合流式处理和批量处理,因此既具有批处理的高吞吐率和高可靠性,又具有流式处理的低延迟。
在数据存储方面。针对lambda、summingbird等框架,对于流式处理结果的存储使用memcache、redis等内存数据库;对于批量处理结果的存储则使用hbase、mysql等持久化数据库进行存储。流式数据经过处理后进行存储,然而通用内存数据库并未对数据存储进行优化,如redis的相同批次结果可能存储在不同的桶中,这样会导致在查询时多次定位桶寻找相应结果,加大查询延迟,因此需要高效地存储数据以保证查询的高效性;并且通用内存数据库由于保存了数据存活时间等信息,因此在内存占用率方面也较高,因此需要设计高效的缓存结构以降低内存使用率;此外,对于实时查询而言,lambda、summingbird等框架并未缓存批量层的结果,这样在热点事件的高并发高重复查询情况下,请求查询延迟较高。
技术实现要素:
针对现有技术的以上缺陷或改进需求,本发明提供了一种基于多级缓存结构的流式数据实时处理方法及系统,其目的在于将流式数据使用在线处理和批量处理,将在线处理结果存储于在线缓存,并设计在线缓存结构使其自动高效删除过期数据;将近期访问离线持久化数据库的数据存于批量缓存,并采用基于lru的策略高效淘汰过期数据;将查询结果高效合并以快速返回给用户,由此解决现有方法中存在的存储与查询效率不高,可靠性低,内存占用率较高的问题。
为实现上述目的,按照本发明的一个方面,提供了一种基于多级缓存结构的流式数据实时处理方法,该方法包括以下步骤:
(1)数据流操作判断,若是数据流存储,则进入步骤(2);若是数据流查询,则进入步骤(7)和步骤(8);
(2)数据预处理:将高速数据流导入消息处理队列;对消息队列中消息添加时间信息,根据时间确定消息batchid;随后进入步骤(3)和步骤(5);
(3)在线数据存储:将消息流转发至在线层使用在线处理框架进行在线处理,将在线处理结果((k,batchid),v)存储于在线缓存中;
(4)关键字存储:将关键字k存储于二进制向量数据结构中,存储结束;
(5)批量数据存储:将消息流转发至批量层,待一个批次消息全部存储后,使用批量处理框架进行批量处理,将批量处理结果(k,(batchid,v))存储于k-v数据库中;
(6)批量缓存更新:批量处理完成后,更新批量缓存;存储结束;
(7)在线缓存查询:用户提交查询请求,根据关键字k查询在线缓存;
(8)批量缓存查询:用户提交查询请求,根据关键字k查询批量缓存;
(9)结果合并返回:合并在线结果与批量缓存结果,将合并结果返回给用户;查询结束。
进一步地,所述步骤(2)中对消息队列中消息添加时间信息,根据时间确定消息batchid具体包含以下子步骤:
(21)判断消息是否包含时间信息;若是,则进入步骤(22);若否,则根据进入消息队列时间添加时间信息;
(22)提取消息包含的时间;
(23)根据时间确定消息batchid。
进一步地,所述步骤(3)中将在线处理结果((k,batchid),v)存储于在线缓存中具体包含以下子步骤:
(31)对k进行哈希操作,获取哈希码,对哈希码和桶的大小n进行与操作以确定桶编号i;
(32)判断桶的第i项是否为空,若是,则创建平衡树;进入步骤(23);若否,直接进入步骤(23);
(33)判断平衡树是否包含k,若是,则进入步骤(24);若否,则创建结果缓存存放k对应的(batchid,v);
(34)将结果缓存大小和k对应的batchid进行与操作以确定存放位置temp;
(35)将(batchid,v)存放至结果缓存的第temp项中。
进一步地,所述步骤(4)具体包括以下子步骤:
(41)提取k对应的batchid;
(42)判断batchid是否等于前个batchid,若是,则将k存入二进制向量数据结构;若否,则将前个batchid和二进制向量数据结构存入哈希映射中;
(43)将batchid赋值给前个batchid;
(44)创建新的二进制向量数据结构。
进一步地,所述步骤(6)具体包括以下子步骤:
(61)根据批量层的batchid从哈希映射中获取对应的二进制向量数据结构;
(62)遍历批量缓存的k,判断二进制向量数据结构是否包含k,若是,则从批量缓存中删除k对应的记录;若否,则跳过该k;
(63)清空该二进制向量数据结构;
(64)从哈希映射中移除batchid和二进制向量数据结构。
进一步地,所述步骤(7)具体包括以下子步骤:
(71)对k进行哈希操作,获取哈希码;
(72)对哈希码和桶的大小n进行与操作以确定桶编号i;
(73)判断桶的第i项是否为空,若是,则表示在线缓存无结果;若否,则返回(batchid,v)列表。
进一步地,所述步骤(8)具体包括以下子步骤:
(81)使用k查询批量缓存;
(82)判断查询结果是否为空;若是,则进入步骤(83);若否,查询结果为(batchid,v);
(83)使用k查询k-v数据库;
(84)判断查询结果是否为空;若是,则表示批量层无结果;若否,查询结果为(batchid,v)。
进一步地,所述步骤(9)具体包括以下子步骤:
(91)遍历在线缓存结果(batchid,v)列表;
(92)判断batchid是否大于批量层的batchid;若是,则与批量层的v合并;若否,则跳过;
(93)遍历完后得到合并总结果。
按照本发明的另一方面,提供了一种基于多级缓存结构的流式数据实时处理系统,该系统包括以下模块:
数据流操作判断模块,用于判断数据流操作,若是数据流存储,则进入数据预处理模块;若是数据流查询,则进入在线缓存查询模块和批量缓存查询模块;
数据预处理模块,用于将高速数据流导入消息处理队列;对消息队列中消息添加时间信息,根据时间确定消息batchid;随后进入在线数据存储模块和批量数据存储模块;
在线数据存储模块,用于将消息流转发至在线层使用在线处理框架进行在线处理,将在线处理结果((k,batchid),v)存储于在线缓存中;
关键字存储模块,用于将关键字k存储于二进制向量数据结构中,存储结束;
批量数据存储模块,用于将消息流转发至批量层,待一个批次消息全部存储后,使用批量处理框架进行批量处理,将批量处理结果(k,(batchid,v))存储于k-v数据库中;
批量缓存更新模块,用于批量处理完成后,更新批量缓存;存储结束;
在线缓存查询模块,用于用户提交查询请求,根据关键字k查询在线缓存;
批量缓存查询模块,用于用户提交查询请求,根据关键字k查询批量缓存;
结果合并返回模块,用于合并在线结果与批量缓存结果,将合并结果返回给用户;查询结束。
进一步地,所述数据预处理模块中对消息队列中消息添加时间信息,根据时间确定消息batchid具体包含以下单元:
时间信息判断单元,用于判断消息是否包含时间信息;若是,则进入时间提取单元;若否,则根据进入消息队列时间添加时间信息;
时间提取单元,用于提取消息包含的时间;
batchid确定单元,用于根据时间确定消息batchid。
进一步地,所述在线数据存储模块中将在线处理结果((k,batchid),v)存储于在线缓存中具体包括:
桶编号确定单元,用于对k进行哈希操作,获取哈希码,对哈希码和桶的大小n进行与操作以确定桶编号i;
桶判断单元,用于判断桶的第i项是否为空,若是,则创建平衡树;进入平衡树判断单元;若否,直接进入平衡树判断单元;
平衡树判断单元,用于判断平衡树是否包含k,若是,则进入存放位置确定单元;若否,则创建结果缓存存放k对应的(batchid,v);
存放位置确定单元,用于将结果缓存大小和k对应的batchid进行与操作以确定存放位置temp;
存放单元,用于将(batchid,v)存放至结果缓存的第temp项中。
进一步地,所关键字存储模块具体包括:
提取单元,用于提取k对应的batchid;
判断对比单元,用于判断batchid是否等于前个batchid,若是,则将k存入二进制向量数据结构;若否,则将前个batchid和二进制向量数据结构存入哈希映射中;
赋值单元,用于将batchid赋值给前个batchid;
创建单元,用于创建新的二进制向量数据结构。
进一步地,所述批量缓存更新模块具体包括:
数据结构获取单元,用于根据批量层的batchid从哈希映射中获取对应的二进制向量数据结构;
数据结构判断单元,用于遍历批量缓存的k,判断二进制向量数据结构是否包含k,若是,则从批量缓存中删除k对应的记录;若否,则跳过该k;
清空单元,用于清空该二进制向量数据结构;
移除单元,用于从哈希映射中移除batchid和二进制向量数据结构。
进一步地,所述在线缓存查询模块具体包括:
哈希码获取单元,用于对k进行哈希操作,获取哈希码;
与操作单元,用于对哈希码和桶的大小n进行与操作以确定桶编号i;
判断单元,用于判断桶的第i项是否为空,若是,则表示在线缓存无结果;若否,则返回(batchid,v)列表。
进一步地,所述批量缓存查询模块具体包括以下单元:
批量缓存查询单元,用于使用k查询批量缓存;
查询判断第一单元,用于判断查询结果是否为空;若是,则进入数据库查询单元;若否,查询结果为(batchid,v);
数据库查询单元,用于使用k查询k-v数据库;
查询判断第二单元,用于判断查询结果是否为空;若是,则表示批量层无结果;若否,查询结果为(batchid,v)。
进一步地,所述结果合并返回单元具体包括以下单元:
在线缓存遍历单元,用于遍历在线缓存结果(batchid,v)列表;
对比判断单元,用于判断batchid是否大于批量层的batchid;若是,则与批量层的v合并;若否,则跳过;
合并返回结果单元,用于遍历完后得到合并总结果。
总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有以下技术特征及有益效果:
(1)本发明通过挖掘缓存数据存储结构中影响存储时间的变动因素,并探讨变动因素对存储时间的影响,设计合理的hash存储结构来提升存储速度和访问效率;
(2)本发明通过在线缓存引进自动替换策略和批量缓存基于lru替换策略来提高查询效率和系统的稳定性。
附图说明
图1为本发明实施例的实施步骤流程图;
图2为本发明实施例中步骤(2)的细化流程图。
图3为本发明实施例中步骤(3)的细化流程图。
图4为本发明实施例中步骤(4)的细化流程图。
图5为本发明实施例中步骤(5)的细化流程图。
图6为本发明实施例中步骤(7)的细化流程图。
图7为本发明实施例中步骤(8)的细化流程图。
图8为本发明实施例中步骤(9)的细化流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
如图1所示为本发明实施例具体流程图
(1)数据流操作判断,若是数据流存储,则进入步骤(2);若是数据流查询,则进入步骤(7)和步骤(8);
(2)数据预处理:将高速数据流导入消息处理队列以平衡数据速率,提高系统的稳定性;对消息队列中消息添加时间信息,根据时间确定消息batchid;随后进入步骤(3)和步骤(5);如图2所示,本步骤中对消息队列中消息添加时间信息具体包括以下子步骤:
(21)判断消息是否包含时间信息;若是,则进入步骤(22);若否,则根据进入消息队列的时间添加时间信息;
(22)使用timeextractor提取时间;
(23)根据时间确定batchid。
(3)在线数据存储:将消息流转发至在线层使用storm进行在线处理,将在线处理结果((k,batchid),v)存储于在线缓存中;如图3所示,本步骤中将在线处理结果((k,batchid),v)存储于在线缓存中具体包括以下子步骤:
(31)对k进行哈希操作,通过java对象的hashcode函数获取hash码;对hash码和桶hasharray的大小n进行与操作以确定桶编号i;
(32)判断桶hasharray[i]是否为空;若是,则创建平衡树balancetree;进入步骤(33);若否,则直接进入步骤(33);
(33)判断balancetree是否包含关键字k;若是,则进入步骤(55);若否,则创建valuecache存放k对应的(batchid,v);
(34)将valuecache大小和k对应的batchid进行与操作以确定存放位置temp;
(35)将(batchid,v)存放至valuecache[temp]中。
(4)关键字存储:将关键字k存储于bloomfilter中,存储结束;如图4所示,本步骤具体包括以下子步骤:
(41)提取k对应的batchid;
(42)判断batchid是否等于lastbatchid,若是,则将k存入bloomfilter;若否,则将前个batchid和bloomfilter存入hashmap中;
(43)将batchid赋值给lastbatchid;
(44)创建新的bloomfilter。
(5)批量数据存储:将消息流转发至批量层,待一个批次消息全部存储后,使用批量处理框架进行批量处理,批量处理结果(k,(batchid,v))存储于hbase中;
(6)批量缓存更新:批量处理完成后,更新批量缓存;存储结束;
(61)根据批量层的batchid从hashmap中获取对应的bloomfilter;
(62)遍历批量缓存batchcache的k,判断bloomfilter是否包含k,若是,则从批量缓存batchcache中删除k对应的记录;若否,则跳过该k;
(63)清空该bloomfilter;
(64)从hashmap中移除batchid和bloomfilter。
(7)在线缓存查询:用户u提交查询请求,根据关键字k查询在线缓存;如图6所示,本步骤具体包括以下子步骤:
(71)对k进行哈希操作,通过java对象的hashcode函数获取hash码;
(72)对hash码和桶hasharray的大小n进行与操作以确定桶编号i;
(73)判断桶hasharray[i]是否为空;若是,则表示在线缓存无结果;若否,则返回结果list((batchid,v))。
(8)批量缓存查询:用户u提交查询请求,根据关键字k查询批量缓存;如图7所示,本步骤具体包括以下子步骤:
(81)使用k查询批量缓存;
(82)判断查询结果是否为空,若是,则进入步骤(113);若否,查询结果为(batchid,v);
(83)使用k查询hbase;
(84)判断查询结果是否为空,若是,则表示批量层无结果;若否,查询结果为(batchid,v)。
(9)结果合并返回:合并在线结果与批量缓存结果,将合并结果返回给用户u;查询结束。如图8所示,本步骤具体包括以下子步骤:
(91)遍历在线缓存结果list((batchid,v));
(92)判断batchid是否大于批量层的batchid,若是,则与批量层的v合并;若否,则跳过;
(93)遍历完后得到合并总结果。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。