发明内容
为了解决上述技术问题,本发明在现有分布式系统集群之上,提供了针对日志流的查询共享和存储复用的方法,用于缓存和预取集群系统中的日志数据及其中间结果,目标是能够加快日志系统中历史日志数据和实时日志数据的处理速度。
为实现上述目的,本发明提供一种基于分级复用的日志数据流的查询共享方法,其中包括:
步骤1、将包含多个查询语句的查询操作注册到系统,通过设定滑动窗口对日志数据流中的元组进行截取;
步骤2、对多个该查询语句进行预处理,提取其中具有相同子查询的查询语句,并将其所查询结果作为中间结果加以存储,该中间结果用以在多个查询操作间进行共享;
步骤3、从步骤1所截取的元组中提取具有相同中间存储结构的元组,并将其采用共享队列的方式加以存储以在多个查询操作间进行共享。
该基于分级复用的日志数据流的查询共享方法,其中步骤3中该共享队列具有二级索引,包括:主队列,用作接收、存储和传递该相同元组;从队列,用于存储和发送该相同元组在日志数据流中的索引至该主队列;其中主队列和从队列间的通信采用异步模式。
该基于分级复用的日志数据流的查询共享方法,其中步骤2中该相同子查询,包括查询语句间操作符相同及其关联的操作数也相同。
该基于分级复用的日志数据流的查询共享方法,其中该步骤1中采用对日志数据流概要数据结构进行查询或对无限的日志数据流进行抽样的方法对日志数据流中元组进行截取。
基于分级复用的日志数据流的查询共享方法,其中步骤2中该预处理包括:根据数据库引擎里的词法分析语法分析模块对该查询语句进行转换,将复杂查询语句转换为简单查询语句;调整该查询语句中查询操作符的顺序,将查询转换成内部表示。
本发明还提供一种基于分级复用的日志数据流的查询共享系统,其中包括:
截取模块,用于将包含多个查询语句的查询操作注册到系统,通过设定滑动窗口对日志数据流中的元组进行截取;
查询结果共享模块,用于对多个该查询语句进行预处理,提取其中具有相同子查询的查询语句,并将其所查询结果作为中间结果加以存储,该中间结果用以在多个查询操作间进行共享;
元组共享模块,用于从截取模块所截取的元组中提取出具有相同中间存储结构的元组,并将其采用共享队列的方式加以存储以在多个查询操作间进行共享。
该基于分级复用的日志数据流的查询共享系统,其中元组共享模块中该共享队列具有二级索引,包括:主队列,用作接收、存储和传递该相同元组;从队列,用于存储和发送该相同元组在日志数据流中的索引至该主队列;其中主队列和从队列间的通信采用异步模式。
该基于分级复用的日志数据流的查询共享系统,其中查询结果共享模块中该相同子查询,包括查询语句间操作符相同及其关联的操作数也相同。
该基于分级复用的日志数据流的查询共享系统,其中该截取模块中采用对日志数据流概要数据结构进行查询或对无限的日志数据流进行抽样的方法对日志数据流中元组进行截取。
该基于分级复用的日志数据流的查询共享系统,其中查询结果共享模块中该预处理包括:根据数据库引擎里的词法分析语法分析模块对该查询语句进行转换,将复杂查询语句转换为简单查询语句;调整该查询语句中查询操作符的顺序,将查询转换成内部表示。
总的来讲,本发明针对日志流查询存储共享,设计了一种基于共享队列的二级索引作为日志流中间结果的存储结构,并相应地提出了一种日志流存储共享的迁移算法,保证对日志流元组的数据进行有效存储、快速索引的前提下,也为数据共享情况下的迁移提供了一定的灵活性;针对子查询共享,通过向日志流的相同谓词查询的抽取和共享操作,达到计算资源共享的目的。
具体实施方式
为让本发明的上述特征和效果能阐述的更明确易懂,下文列举实施示例,并配合说明书附图作详细说明如下。
日志流查询预处理对象是以查询操作符(谓词)为基本单位的。进入系统的日志流中的每个元组必须经过所有的查询操作符后,方能输出查询结果。因此,每个元组在等待相应查询操作符处理时,会被存储在相应的查询操作符队列中。在有些情况下,这些队列中的元组数是大致相同的。例如,投影操作符仅是将元组的相应属性组成新的元组输出到下一个查询操作符的等待队列中,元组的个数并没有改变。而在通常的数据流查询处理过程中,这些构成相同的中间处理结果将会被分别存储并处理,浪费了系统的存储空间,而在本发明中,中间处理结果会暂存到操作符队列,在实现过程中该队列存放的是数据的索引,因为存放原始数据的存储开销太大;查询处理模块会将相关的日志流数据都的索引储存到内存中,但是不同的请求会使用到这些数据不同的部分,如投影不同的属性值。同时,在存在多个查询语句的数据流管理系统中,会存在对于相同的数据流中间存储结果进行处理的多个操作符,而这些操作符多半是选择或投影操作符,因此其查询处理过程与结果也有很大的相同之处,如果能将这些相同的结果采用共享的方式进行存储,不仅能够节省系统的存储空间,而且能够提高系统的处理效率,其中该共享指将查询热度高的数据流中间结果在不同的查询请求间进行共享,这里的请求可能是复杂查询,也可能是复杂查询的子查询,如查询处理程序将日志流缓存映射到内存,不同的请求查询的数据不尽相同,有些用这些日志数据来做投影运算,而有些用来做连接运算。因此,查询共享研究的目标即为,将日志流查询处理中的数据根据查询热度对相同或相同部分进行分级处理,然后进行查询共享及存储共享,以达到一次处理、多处获益的效果。本发明采用的步骤和每一步的技术方案如下:
A.日志流查询共享,其实现方法为:
A1.数据查询共享方法(数据共享)
A1-1数据流查询处理是以查询操作符为基本单元的,查询操作符就是查询谓词,比如select、join、group、sequence(顺序操作)等,有查询操作符和数据对象(集合、表、视图)构成了查询语句,查询语句可以在逻辑上表示成树的结构,叶子节点是数据对象,非叶子节点是查询操作符。
每个元组在经过所有的查询操作符后,才能输出查询结果。因此,每个元组在等待相应查询操作符处理时,会被存储在相应的查询操作符队列中。
A1-2在存在多个查询语句的数据流管理系统中,通常会存在对相同的数据流中间查询结果进行处理的多个操作符,甚至是针对相同的数据流上的相同的计算表达式,即公共相同子查询。为减少查询计算次数,考虑使用子查询共享策略。
A1-3如图1所示,一般情况下,子查询共享是指相同子查询共享,即操作符以及由其关联的操作数完全相同的情况下,共享该操作符的结点、该操作数的结点、及该操作符和该操作数共同组成的计算结果,以合并查询语法树。
例如依次注册到系统中的三个查询,“;”表示顺序查询谓词,“∧”、“∨”分别表示为集合合取操作符、集合析取操作符,通过下面的查询语法树 (见图1)可以发现三个查询可以共享数据流S1、S2,减少了存取数据流S1、 S2的次数。
日志流查询1:CQ1=S1;S2=S1|;S2=LS1;
日志流查询2:CQ2=S2;S1=S1;|S2=LS2;
日志流查询3:CQ3=S1∧S2=(S1;S2)∨(S2;S1)=LS1∨LS2;
其中操作符“;”表示严格的日志流事件顺序的顺序操作符;“|;”和“;|”为表达S1、S2的数据共享,在操作符上表述两者的先后顺序关系;CQ3这一查询中等式成立的条件是在查询语义成立的条件下逻辑表达式转换。
在大多数情况下我们希望的一种情形是不仅数据可以共享,如上述情形,而且连操作也可以共享,这样就可以共享日志流经过操作后的中间结果,下述情形为操作符共享方法。显然共享数据时不一定能共享操作,但共享操作一定能共享数据。
A2.操作符共享方法(操作共享)
经过上述数据查询优化(数据共享)后,在日志流间查找可共享的操作符,该操作符一般具有如下特征:
1.是同一类操作符,一般为简单操作符,即投影操作符或选择操作符;
2.他们需要处理的日志流具有相同的结构特征,易于实现共享;
3.具备相同的查询条件,即对于相同的日志流操作后得到相同的结果。
A2-1.子查询操作直接共享
将多个符合条件的操作符共享,将共享结果供多个查询(每个查询都可以表示为一棵查询语法树)使用,如图2上半部分内容所示的查询序列通过子查询共享后得到图2下半部分内容所示的查询序列。
A2-2.子查询操作间接共享
在实际查询过程中同时具备上面三个条件的可共享的操作符并不多见,尤其是第三个条件,要求查询条件相同,在实际查询过程中较为少见。但是如果对具备前两个条件的查询操作符进行相应查询条件的转化,使其符合第三个条件,便可以进行操作符共享。转换的前提是日志流满足特征1、2,即查询语法里包含相同的查询子句,并且查询的数据范围相同或存在包含关系。这里需要额外说明的是处理数据流时需要同时兼顾存储在磁盘中的数据和在线的实时数据。如果查询历史数据就退化为简单的数据库查询,如果只查询在线数据 (如统计)就退化为数据流上的查询。
如图3所示,两选择操作符因为查询条件不同而不能进行共享,但经过转化x>200的查询条件可以利用x>100的查询结果进行进一步的查询,从而使得查询能够在一定程度上进行共享。
B.日志流存储共享。经过上面对数据共享和操作共享的分析,共享是非常必要的也是可行的,但是上述两种共享后的数据需要在内存和磁盘中组织数据,本部分侧重从存储角度如何实现共享。其实现方法为:
B1.存储共享模型设计
以查询操作符队列为基础,采用共享队列的二级索引方式来实现数据流元组的存储。它在保证数据一次索引下找到请求数据,同时为数据共享情况下的迁移提供了一定的灵活性。
B1-1.存储共享模型设计要点:
B1-1-1.主队列,用作接收、存储和传递各日志流,存储包括暂时存储和永久存储;并为每个子数据流设置一个从队列,该从队列用以存储和发送该子数据流至该主队列;
B1-1-2.主队列和从队列间的通信采用异步模式,即一个数据处理窗口内,某从队列完成查询运算生成索引信息后,不必等待其他从队列,可立即将该索引信息发送至该主队列。
此种数据存储方式的优势在于主队列和从队列互为备用,确保数据信息的安全性,且从队列存储量小,并且采用异步通信策略,有助于查询信息的实时共享,提高了数据信息的利用效率。
B1-1-3.子流与主流是相对而言,逻辑上,子日志流汇聚为主日志流,这里的主日志流也可能继续汇聚成更高层次的主日志流,汇聚与否跟业务层次需求相关。这里跟日志所在服务器的区域概念相对应,比如按从简单到复杂分为单机服务器,多个单机服务器组成集群,集群组成数据中心,不同的数据中心会有跨域的概念,等等。另外这种数据处理逻辑也体现了分级复用的目的。
B1-1-4.为方便索引,在主队列和从队列直接可以增加一级或多级主队列的镜像队列,用来存放主队列数据的地址信息,方便数据的迁移和更新。
B1-1-5.该数据队列的引用方式如图4所示。图4中,S1~S4分别代表不同日志流的中间结果存储队列,例如某请求查询系统中所有出现ERROR的日志,那么S1代表的是应用1中的ERROR的日志,S2代表的是应用2中ERROR 的日志,以此类推,通常这些队列中含有一些相同的中间处理元组。如果将这些元组直接存储在这些中间队列中,则相同的元组可能会在多个中间队列中重复出现,浪费了有限的存储空间。因此,考虑将元组统一存储在队列S(主队列)中,而S1~S4只存放和维护这些元组在队列中的索引。
B1-2.为解决数据迁移的灵活性问题,在主队列S和中间结果存储队列S1~S4之间又增设了一个中间索引地址队列S’(辅队列)。在S’中存储队列S中元组的地址,而S1~S4中只存储指向S’中这些地址的指针。这样,当进行数据迁移时,仅需要改动S’队列中的内容,而不需要频繁地变更队列 S1~S4中相同的内容。
B1-3.为方便理解此处再次声明:主队列S,日志流汇聚后的元组队列;辅队列S’,中间索引地址队列;SS1-SS4是日志流的中间结果队列,与前面的参与运算的原始日志流S1、S2不同,前者的抽象是为存储(不限于SS1-SS4),后者的抽象是为查询和逻辑运算,最多涉及两个对象(S1,S2)。
B1-4.通过数据流队列S和相应地址队列S’互相索引,既可以实现数据迁移时元组的地址在S’中的动态改变,而且操作符控制的数据中间处理结果队列通过对S’地址的索引完成,从而间接索引到S队列中的元组,使得数据迁移有了一定的灵活性。
C.本发明的目标是在分布式日志流处理系统上,实现日志流数据的存储共享和查询共享,提升分布式流处理系统的响应速度。根据上述查询共享和存储共享两部分的设计要点,对于系统中的查询实现共享的详细实施步骤如下:
C1.日志流查询处理,其实现的基本过程方法为:
C1-1.首先将用CQL语言表达的查询操作注册到系统,并通过设定滑动窗口,将数据流中最近到达的n个元组或最近t时间内的到达的元组进行存储。
C1-2.对概要数据结构进行查询或对无限的数据流进行抽样,将数据流中的查询数据范围限制在一个有限的区间(滑动窗口)内查询,对于实时数据这种查询只能得到近似的查询结果,是一种近似查询。
C1-3.针对数据流增加了两个新的关键字Rows和Range,Rows后接数字 n,表示截取最近到达的n个元组进行操作;而Range后接时间t(时间戳),表示截取最近t时间内的元组进行操作,通过这种方式对数据流进行限流处理。
根据A的步骤可以得到如下类似的多种应用相关的CQL查询语句
Select S1.source,S2.destination,S1.content
From S1[Rows 10000],S2[Range 2min]
Where S1.APPID=S2.APPID and S1.type>=100and seq(S1;S2)
其中S1,S2表示同一应用日志流,type=100表示日志的类型为ERROR,值越大表示错误越严重type=200表示致命错误;
C2.思路:查询语句的预处理:
C2-1词法分析语法分析,根据数据库引擎里的词法分析语法分析模块对查询语句进行转换,将复杂查询转换为简单查询。如对于上述CQL查询语句,查询分析模块会从where部分开始将上述复杂的查询分解为连接 (S1.APPID=S2.APPID)、顺序(seq(S1;S2))、选择(select)等。
C2-2调整查询操作符的顺序,优化查询,生成查询语法树,即将查询转换成内部表示,如对于关系型操作可以表示成关系代数语法树。即查询语句可以在逻辑上表示成树的结构,叶子节点是数据对象,非叶子节点是查询操作符。查询优化模块将投影和选择等基本操作下放到接近输的叶子结点处;
C2-3将基本的操作首先执行,如果使用相同的数据流对象,可以将多个基本操作同时进行。例如,将把投影和选择运算同时进行。如有若干投影和选择操作,并且他们都针对同一个关系操作,则可以在扫描此关系的同时完成所有的这些运算以避免重复缓存以扫描数据流对象;
C2-4找出公共子表达式(子查询)。如果这种重复出现的子表达式的结果不是很大的关系,并且从外存中读取这个关系比计算该子表达式的时间少得多,则先计算一次公共子表达式并把结果写入中间结果用以共享;
C3.在设计查询共享模型时,需重点考虑和解决以下几个问题:
C3-1.发现共享,即从系统的数据流查询条件(界定查询数据范围的限制子句,如where、with,属于查询语句的一部分)和存储结构中发现那些适合于共享处理的元组,比如元组是否具有相同的中间存储结构和相同的查询操作符,这些共享不限于单个查询内部,也包括多个查询之间,如图1中的两个连续查询CQ1和CQ2;
C3-2.共享的结构和算法设计,即设计相应的数据结构和算法,完成数据流相关结构共享的要求,详细参见发明内容部分B.日志流存储共享实现方法;
C3-3.相关处理,即如何处理好数据流查询中共享部分与非共享部分的连接,一方面从不同的查询请求着眼,系统中的查询请求是不一样的,最终还是按各自查询树(图)的结构处理整个查询;另一方面共享和非共享部分也包括数据和操作两方面,在存储上还是用指针钩链的方式索引到相应的数据和操作。从而在数据共享的情况下保证数据流查询处理的有效性和执行速度。
C4.数据迁移算法设计,数据迁移用作存储共享的一个应用示例或者是作为内存中日志数据的换入换出策略,其实现方法为:
C4-1.定义如下变量:指向元组的指针q,q’,共享元组队列首地址S;共享元组索引地址队列首地址S’;临时指针p。
需要定义如下函数:
GetTupleReference(q):用于获得q指向元组的引用计数;
GetTupleAddress(q):用于获得q指向的元组在S’队列中地址索引的地址;
Copy(q,q’):将q指向的元组内容复制到q’中。
C4-2.具体的数据迁移算法如图6所示。
C4-3.在算法过程中,需要根据中间结果队列对元组的引用情况进行引用计数,当计数减到0或者元组时间戳超时表示元组可以被抛弃,需进行复位操作。数据迁移由系统每隔一定的时间进行,将进行复位操作的元组删除,同时将有效元组做紧缩处理,同时更改队列S’的地址内容。
综合上述A、B、C各部分的阐述,最终实现的目标是查询共享,各部分的逻辑关系如图6所示。
以下为与上述方法实施例对应的系统实施例,本实施方式可与上述实施方式互相配合实施。上述施方式中提到的相关技术细节在本实施方式中依然有效,为了减少重复,这里不再赘述。相应地,本实施方式中提到的相关技术细节也可应用在上述实施方式中。
本发明还提供一种基于分级复用的日志数据流的查询共享系统,其中包括:
截取模块,用于将包含多个查询语句的查询操作注册到系统,通过设定滑动窗口对日志数据流中的元组进行截取;
查询结果共享模块,用于对多个该查询语句进行预处理,提取其中具有相同子查询的查询语句,并将其所查询结果作为中间结果加以存储,该中间结果用以在多个查询操作间进行共享;
元组共享模块,用于从截取模块所截取的元组中提取出具有相同中间存储结构的元组,并将其采用共享队列的方式加以存储以在多个查询操作间进行共享。
该基于分级复用的日志数据流的查询共享系统,其中元组共享模块中该共享队列具有二级索引,包括:主队列,用作接收、存储和传递该相同元组;从队列,用于存储和发送该相同元组在日志数据流中的索引至该主队列;其中主队列和从队列间的通信采用异步模式。
该基于分级复用的日志数据流的查询共享系统,其中查询结果共享模块中该相同子查询,包括查询语句间操作符相同及其关联的操作数也相同。
该基于分级复用的日志数据流的查询共享系统,其中该截取模块中采用对日志数据流概要数据结构进行查询或对无限的日志数据流进行抽样的方法对日志数据流中元组进行截取。
该基于分级复用的日志数据流的查询共享系统,其中查询结果共享模块中该预处理包括:根据数据库引擎里的词法分析语法分析模块对该查询语句进行转换,将复杂查询语句转换为简单查询语句;调整该查询语句中查询操作符的顺序,将查询转换成内部表示。
虽然本发明以上述实施例公开,但具体实施例仅用以解释本发明,并不用于限定本发明,任何本技术领域技术人员,在不脱离本发明的构思和范围内,可作一些的变更和完善,故本发明的权利保护范围以权利要求书为准。