发明内容
本发明的技术目的是:采用redis集群作为计算中间结果存储介质,有效结合实时数据流window的概念,并充分利用redis高效的特性,实现了一套快速、准确、通用的实时大数据流的聚合方法。
为现实以上技术目的,本发明技术方案提供了一种实时数据流聚合查询的实现方法,包括以下步骤:
步骤S1,分析聚合查询语句,提取查询语句中的关键字段信息,并确定聚合算法;
步骤S2,根据计算需求定义实时数据流的window宽度,从实时数据流中不断读取数据,按window宽度筛选出数据;
步骤S3,对筛选出的数据,根据关键字段信息,利用md5算法和sadd算法得到第一数据集合,同时利用md5算法、val函数、sadd算法得到第二数据集合;
步骤S4,通过scard算法将第一数据集合和第二数据集合进行聚合计算,并拼合成聚合结果集合;
步骤S5,将聚合计算后的聚合结果集合存入关系型数据库或者分布式文档存储数据库中供应用系统调用。
进一步的,在步骤S1中,获取查询的关键字段信息至少包括:时间、类型、地址、名称。
进一步的,在步骤S2中,window宽度根据关键字段信息中的数据计算得到或系统自定义。
进一步的,在步骤S3中,利用md5算法和sadd算法得到第一数据集合的步骤为:首先读取关键字段信息的值,将一部分关键字段信息的值运用到md5算法中,并通过md5算法对筛选出数据进行运算,然后在利用sadd算法将md5算法计算后的值和另一部分关键字段信息的值进行拼合,并添加到第一数据集合中,计算完成以后,最终得到第一数据集合。
进一步的,在步骤S3中,利用md5算法和val函数得到第二数据集合的步骤为:首先读取关键字段信息的值,将全部关键字段信息的值运用到md5算法中,并通过md5算法对筛选出数据进行运算,然后利用val函数对关键字段信息的值进行运算,在由sadd算法将md5算法计算后的值和val函数计算后的值进行拼合,并添加到第二数据集合中,计算完成以后,最终得到第二数据集合。
进一步的,在步骤S4中,在步骤S4中,使用scard算法计算以前,需启动一个新的分析线程定期读取将全部关键字段信息的值运用到md5算法中计算后的值,再逐个遍历取出val函数计算后的值,再通过md5算法进行计算,计算后的值由scard算法进行拼合。
进一步的,在步骤S4中,scard算法的操作时间复杂度为O(1)。
进一步的,在步骤S5中,聚合计算后的聚合结果集合中的数据由下一分析线程发送至关系型数据库或者分布式文档存储数据库。
进一步的,第一数据集合、第二数据集合均存入redis。
进一步的,在步骤S1中,聚合算法至少包括md5算法、sadd算法、scard算法、val函数。
本发明采用redis集群作为计算中间结果存储介质,有效结合实时数据流中window的概念,并充分利用redis高效的特性,实现了一套快速、准确、通用的实时大数据流的聚合方法,能够满足大数据流式不断变化的数据聚合需求。
本发明可以很容易在storm、spark等大数据实时处理平台上实现,并且可以充分利用这些平台的并进计算的特点提高处理效率和数据吞吐量。
本发明采用采用redis集群作为计算中间结果存储介质,实时数据流的计算是基于内存运算的,能够达到秒级的延时。
本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,旨在用于解释本发明,而不能理解为对本发明的限制。
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis是一个高性能的key-value数据库。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。
本发明技术方案提供了一种实时数据流聚合查询的实现方法,如图1所示,包括以下步骤:
步骤S1,分析聚合查询语句,提取查询语句中的关键字段信息,并确定聚合算法。
其中,获取查询的关键字段信息至少包括:时间、类型、地址、名称。聚合算法至少包括md5算法、sadd算法、scard算法、val函数。
步骤S2,根据计算需求定义实时数据流的window宽度,从实时数据流中不断读取数据,按window宽度筛选出数据;其中,window宽度可根据关键字段信息中的数据计算得到或系统自定义。
步骤S3,对筛选出的数据,根据关键字段信息,利用md5算法和sadd算法得到第一数据集合,同时利用md5算法、val函数、sadd算法得到第二数据集合。
利用md5算法和sadd算法得到第一数据集合的步骤为:首先读取关键字段信息的值,将一部分关键字段信息的值运用到md5算法中,并通过md5算法对筛选出数据进行运算,然后在利用sadd算法将md5算法计算后的值和另一部分关键字段信息的值进行拼合,并添加到第一数据集合中,计算完成以后,最终得到第一数据集合。
利用md5算法和val函数得到第二数据集合的步骤为:首先读取关键字段信息的值,将全部关键字段信息的值运用到md5算法中,并通过md5算法对筛选出数据进行运算,然后利用val函数对关键字段信息的值进行运算,在由sadd算法将md5算法计算后的值和val函数计算后的值进行拼合,并添加到第二数据集合中,计算完成以后,最终得到第二数据集合。
步骤S4,通过scard算法将第一数据集合和第二数据集合进行聚合计算,并拼合成聚合结果集合。其中,第一数据集合、第二数据集合均存入redis。采用redis集群作为计算中间结果存储介质,有效结合实时数据流中window的概念,并充分利用redis高效的特性,实现了一套快速、准确、通用的实时大数据流的聚合方法。
使用scard算法计算以前,需启动一个新的分析线程定期读取将全部关键字段信息的值运用到md5算法中计算后的值,再逐个遍历取出val函数计算后的值,再通过md5算法进行计算,计算后的值由scard算法进行拼合。其中scard算法的操作时间复杂度为O(1)。
步骤S5,将聚合计算后的聚合结果集合存入关系型数据库或者分布式文档存储数据库(mongodb)中供应用系统调用。聚合计算后的聚合结果集合中的数据由下一分析线程发送至关系型数据库或者分布式文档存储数据库。
本发明并行化原理简单容易理解,很容易在storm、spark等大数据实时处理平台上编程实现,并且可以充分利用这些平台的并进计算的特点提高处理效率和数据吞吐量。以下用一个简单是实例推演算法的过程:假设聚合的SQL(Structured Query Language,结构化查询语言)为:“select count(distinct(ip))as uv,date,channel from access_logwhere date=20161108group by date,channel;”如图2所示。
第一步:分析聚合查询语句比如:“sql=select count(distinct(ip))as uv,date,channel from access_log where date=20161108group by date,channel;”,提取关键字段为:ip,date,channel。
第二步:根据计算需求定义好的window宽度(如:10分钟),从实时流中不断取出数据按条件date=20161108筛选出数据。
某一个window内access_log数据内容如下表:
然后逐条进行一下两步处理:
1、分别读取date、ip和channel字段的值date_v、ip_v和channel_v做如下运算:key=md5(date_v+channel_v)产生一个key,然后通过redis的sadd(key,ip_v),将ip值添加到redis的一个Set集合里面,得到数据如下:
key=md5(date_v+channel_v)
key Values scard(key)
md5(20161108+qq)192.168.0.1,192.168.0.2,192.168.0.4 3
md5(20161108+baidu)192.168.0.2,192.168.0.12
md5(20161108+xiaomi)192.168.0.3,192.168.0.52
md5(20161108+huawei)192.168.0.3 1
2.key=md5(sql)产生一个key,val={date:date_v,channel:channel_v}产生一个值,然后通过sadd(key,val)将数据存入redis的另一Set集合中;得到数据如下:
key=md5(sql)
key values
md5(sql){date:20161108,channel:qq}
{date:20161108,channel:baidu}
{date:20161108,channel:xiaomi}
{date:20161108,channel:huawei}
第三步:启动一个另外的分析线程定期取出key=md5(sql)中的所有值。逐个遍历取出val={date:date_v,channel:channel_v},通过key=md5(date_v+channel_v)得到key,最后通过redis的scard(key)取出聚合结果集之一uv_v。Redis中的scard(key)操作时间复杂度为:O(1),也就是说该操作和key对应的Set的大小是无关的,利用这个特点可以快速准确的实现聚合运算;得到数据如下:
key values
md5(sql){date:20161108,channel:qq,uv:3}
{date:20161108,channel:baidu,uv:2}
{date:20161108,channel:xiaomi,uv:2}
{date:20161108,channel:huawei,uv:1}
第四步:将上一步得到的{date:date_v,channel:channel_v,uv:uv_v}结果存入关系型数据库或者分布式文档存储数据库(mongodb)中供应用系统调用,得到存储的最后结果集为:
通过以上方式的推演证明本发明方法可以达到预期的计算效果,且非常容易编程实现。本发明技术方案已经在Storm平台上编程实现,具体步骤如下:
第一步:启动一个Spout_A,读取SQL聚合语句,解析SQL并将解析结果发送到数据解析Bolt_A;
第二步:Bolt_A从数据流中此项读取一个window的数据按条件筛选出数据,逐条进行一下两步处理:
1、分别读取date、ip和channel字段的值date_v、ip_v和channel_v做如下运算:key=md5(date_v+channel_v)产生一个key,然后通过redis的sadd(key,ip_v),将ip值添加到redis的一个Set集合里面。
2、key=md5(sql)产生一个key,val={date:date_v,channel:channel_v}产生一个值,然后通过sadd(key,val)将数据存入redis的另一个Set集合中。得到数据如下:
key=md5(date_v+channel_v)
key Values scard(key)
md5(20161108+qq)192.168.0.1,192.168.0.2,192.168.0.4 3
md5(20161108+baidu)192.168.0.2,192.168.0.12
md5(20161108+xiaomi)192.168.0.3,192.168.0.52
md5(20161108+huawei)192.168.0.3 1
key=md5(sql)
key values
md5(sql){date:20161108,channel:qq}
{date:20161108,channel:baidu}
{date:20161108,channel:xiaomi}
{date:20161108,channel:huawei}
第三步:启动一个新的Spout_B每秒钟取出key=md5(sql)中的所有值。逐个遍历取出val={date:date_v,channel:channel_v},并将val数据发送到下一个Bolt_B。
第四步:Bolt_B获取到上一个Spout_B发过来的数据{date:date_v,channel:channel_v},通过key=md5(date_v+channel_v)得到key,后通过redis的scard(key)取出聚合结果集之一uv_v,并拼装成{date:20161108,channel:qq,uv:3}的数据形式发送下一个Bolt_C。得到数据如下:
key values
md5(sql){date:20161108,channel:qq,uv:3}
{date:20161108,channel:baidu,uv:2}
{date:20161108,channel:xiaomi,uv:2}
{date:20161108,channel:huawei,uv:1}
第五步:Bolt_C将Bolt_B发过来的数据{date:date_v,channel:channel_v,uv:uv_v}存入关系型数据库或者mongodb中供应用系统调用。得到最后结果集如下:
本发明采用redis集群作为计算中间结果存储介质,有效结合实时数据流中window的概念,并充分利用redis高效的特性,实现了一套快速、准确、通用的实时大数据流的聚合方法,能够满足大数据流式不断变化的数据聚合需求。
本发明可以很容易在storm、spark等大数据实时处理平台上实现,并且可以充分利用这些平台的并进计算的特点提高处理效率和数据吞吐量。
本发明采用采用redis集群作为计算中间结果存储介质,实时数据流的计算是基于内存运算的,能够达到秒级的延时。
尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在不脱离本发明的原理和宗旨的情况下在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。本发明的范围由所附权利要求极其等同限定。