一,概述
关系型数据用来查询相对静态的数据,如果执行一些复杂的查询,要降低查询的频度。传统关系型数据库普遍将数据存储在硬盘(也有内存数据库),它的检索性能受限于硬盘访问性能。受制于关系型数据库的设计,如果频繁查询数据来实现实时统计则需要在较短时间内构建多次查询语句(SQL),每次检索都耗时较长,关系型数据库会成为系统瓶颈。总而言之,传统关系型数据库并不适合每秒成百上千次的查询统计。Esper引擎可以使用类似于SQL的EPL语句来构建处理模型,处理每秒几万到几十万的实时数据的查询统计。它的工作有点像倒过来的关系型数据库,它不需要像数据库那样存储数据,而是先构建查询语句,引擎依据这些处理模型实时的输出符合的结果。而关系型数据要查询语句提交后才会输出结果。
Esper除核心jar包之外还有诸如io,jdbc,jmx等jar。本文只讲解核心的前几章基础知识。
二,例子
先看一个Epser处理实时数据的例子:收集某网站的实时用户访问日志(accesslog),数据字段如下:
ip(访客ip)、time(访问时间)、url(页面地址)、httpcode(状态码)、agent(浏览器头信息)、sizeinbytes(数据大小)、等等。
场景1,分析1小时(周期)产生的状态码数量:
select httpcode,count(*) as hz from accesslog.win:time_batch(1 hour) group by httpcode otder by hz desc;
场景2,分析1小时(周期)访客对url的访问频率:
select ip,url,count(*) as hz from accesslog.win:time_batch(1 hour) group by ip,url order by hz desc;
场景3,找到可能危险的请求(状态码403 404),分析1小时(周期)访客对url的访问频率:
select ip,url,count(*) as hz from accesslog(httpcode in(403,404)).win:time_batch(1 hour) group by ip,url order by hz desc;
注:三个例子使用了时间批量窗口,它会收集此时间间隔数据一起统计,周期内只输出一次结果(这样更像是关系型数据库的输出形式),以便于理解。
三,入门
1,Esper能做什么?优点有哪些?使用SQL的形式来处理实时数据,支持查询、聚合、连接、过滤等,非常容易上手。
多种形式(时间/长度)窗口统计事件数据,事件之间可以关联分析。
高吞吐(10万事件/秒)低延时(毫秒级别)。