NESPER的大体结构 z
NEsper从内容上分为两块,NEsper的核心NEsper.dll和NEsper.IO.dll。
(1)NEsper的核心包包含了EPL语法解析引擎,事件监听机制,事件处理等核心模块。
(2)NEsper的io包含从各种数据源读取数据以及将输出结果写入各种数据源,包括excel,database,msmq,http,socket,XML。
贴一张esper官网上的结构图,方便大家了解esper的结构

接下来对上述结构图进行详细的解释让大家加深对ESPER的了解
1. Event对象:NESPER处理的事件的最小单位,一个任意的CLR对象,属性支持简单的CLR类型、数组、map、以及嵌套POCO,很灵活.
2.EPL:EPL是ESPER的核心,它类似于SQL,但是和SQL的执行方式不同。
SQL是数据在那里,你每次执行SQL就会触发一次查询;而EPL是查询在这里,数据输入达到一定条件即可触发查询。
这个条件可以有多种:
a).每个event对象来就触发一次查询,并只处理当前对象
select * from OrderEvent
这个EPL语句会在每个OrderEvent对象到达后,并将该event交给后续的Listener(后面会讲到)来进行处理。但是这种用法不多见,意义不大。
b).窗口处理模式:
EPL最大的特色就是这个窗口处理模式,有两种窗口,时间窗口和长度窗口。
时间窗口 : 大家想一下,如果有一个场景,要获取最近3秒内OrderEvent的price的平均值,那该怎么做呢?一般的做法需要做个后台线程来做3秒的时间统计,时间到了再做后续处理,虽然不复杂,但是也挺繁琐的。
看看EPL是怎么做的
select avg(price) from test.OrderEvent.win:time(3 sec)
win:time(3 sec)就是定义了3秒的时间窗口,avg(price)就是统计了3秒内的OrderEvent对象的price的平均值
长度窗口: 长度窗口和时间窗口比较类似
select avg(price) from test.OrderEvent.win:length(100)
win:length(10)就是定义了10个Event的,avg(price)就是统计了最近10个的OrderEvent对象的price的平均值
以上这些都比较容易理解,虽然知道了处理方法,也比较好用,我还是比较喜欢钻研一下他的内部实现方式。先来看一张时间窗口模式的图

他仅保留最近时间窗口的对象内容,但是每个Event到来都会触发一次UpdateListener的操作
EPL语句会作为一个Statement来监听事件的到来,当New Events有新事件时就会触发UpdateListener的操作,下面是一个updateListener的简单例子,event.get("avg(price))就可以获得EPL查询所获得的price平均值,然后就可以加入自己的代码进行处理,比如将结果写入本地文件
而New Events和Old Events就是他的输入,而ave(price)操作所计算的对象就是Length Window中的内容。
public class MyListener : UpdateListener { public void update(EventBean[] newEvents, EventBean[] oldEvents) { EventBean event = newEvents[0]; Console.WriteLine("avg=" + event.Get("avg(price)")); } }
事件窗口也基本类似。
c)批量窗口处理模式
窗口模式是会在每个Event来都触发一次UpdateListener操作,如果每秒Event数量达到很大的话这种方式明显是不行的 CPU消耗会很厉害
批量窗口处理模式正好可以解决这个问题
批量时间窗口模式
select avg(price) from test.OrderEvent.win:time_batch(3 sec)
批量长度窗口模式
select avg(price) from test.OrderEvent.win:length_batch(10)
时间批量模式的操作图如下

上图的时间窗口大小为4s,他会在4s的窗口时间到达以后才将窗口中的内容一起扔给UpdateListener来进行处理,性能相对节约很多,特别是大数据量的情况下。长度批量窗口的处理模式也是类似。
上述窗口模式下内存使用情况又是如何呢?经过本人测试和研究代码发现,它会保留两个窗口的内存使用量,一个保存当前窗口的Events,一个保存上一个窗口的Events,因此在估算一个数据分析程序占用多少内存要看上面监听的EPL语句开的窗口的大小以及数据的TPS,防止内存OOM。
掌握了上面的窗口的概念,后面其他的内容都很好理解了
d) 过滤
where过滤
select avg(price) from test.OrderEvent.win:time_batch(3 sec) where price>10
having过滤
select avg(price) from test.OrderEvent.win:time_batch(3 sec) having price>10
似曾相识啊,执行方式也基本和SQL里的where 和 having差不多。
在EPL里where 是在incoming Events到window之间进行过滤,having是在window到New Eventing之间进行过滤
e)聚合
count
select count(price) from test.OrderEvent.win:time_batch(3 sec) where price>10
sum
select sum(price) from test.OrderEvent.win:time_batch(3 sec) where price>10
group by
select itemName,sum(price) from test.OrderEvent.win:time_batch(3 sec) where price>10 group by itemName
都很简单,了解SQL的都狠容易上手
f) 函数
ESPER默认加载
• System • System.Collections • System.Text
支持这些包下的函数方法,例如
select Math.round(sum(price)) from test.OrderEvent.win:time_batch(3 sec) where price>10
它还支持自定义函数,举个例子,做个计算百分比的函数
public class MyUtilityClass{ public static double computePercent(double amount, double total) { return amount / total * 100; } }
配置一下
<esper-configuration <plugin-singlerow-function name="percent" function-class="mycompany.MyUtilityClass" function-method="computePercent" /> </esper-configuration>
OK了,可以用了
select percent(price,total) from OrderEvent
总体来说,ESPER的EPL功能非常强大,而且基本和SQL类似,入门容易,构造一个实时数据分析系统比较简单,且维护成本低,新应用进来只需要简单配置一下EPL语句就可以了,方便快捷,对大部分的系统还是比较适合的。
NESPER的大体结构 z的更多相关文章
- 位操作:BitVector32结构 z
目录 温习位操作 BitVector32的位操作 CreateMask方法 使用BitVector32.Section来存储小整数 BitVector32结构体位于System.Collections ...
- electron 大体结构
1.Electron支持的平台: OS XWindowsLinux 2.一个标准的electron app包含的结构: Windows 或是 Linux中:electron/resources/app ...
- vue使用vuex大体结构
store1.js const state = {} const mutations = {} const actions = {} const getters = {} export default ...
- 【js】 vue 2.5.1 源码学习(一) 大体结构 (自写版本,非源码)
一.整体思路 1. 首先我们需要解析data,并且data里面的属性添加为vue的属性,并且拿到属性值 . 通过 原型方法 _peoxy实现 Obsever(代理函数) ==> walk ...
- express+gulp构建项目(一)项目目录结构
express是基于nodejs平台的web框架,它可以让我们快速开发出web引用.而gulp是一种自动构建工具,非常强大,有了它,能帮我们完成很多繁琐的工作,例如,静态文件的压缩,为静态文件加上哈希 ...
- delphi.thread.线程循环执行体结构
线程话题太大,又都是些坑,不知从哪方面讲起,所以,想一出是一出了. 不管怎样,我们从开始使用D,不管有没有用线程,其实它已经帮我们做了一个最完整的线程执行处理:Application.Run. 这行A ...
- UIKIT网页基本结构学习
没办法,哈哈,以后一段时间,如果公司没有招到合适的运维研发, 啥啥都要我一个人先顶上了~~~:) 也好,可以让人成长. UIKIT,BOOTSTRAP之类的前端,搞一个是有好处的,我们以前即然是用了U ...
- “MVC+Nhibernate+Jquery-EasyUI”信息发布系统 第二篇(数据库结构、登录窗口、以及主界面)
“MVC+Nhibernate+Jquery-EasyUI”信息发布系统 第二篇(数据库结构.登录窗口.以及主界面) 一.在上一篇文章中,主要说的就是把主框架搭建起来,并且Nhibernate能达到增 ...
- webrtc学习笔记2(Android端demo代码结构)
最近正在修改webrtc的Android端demo和服务器交互的内容,介绍一下demo的大体结构吧,以便能快速回忆. 环境:Android5.0以上.libjingle_peerconnection_ ...
随机推荐
- Linux中的磁盘
Linux的磁盘管理 (很重要请注意高能预警) 硬盘:几个盘片,双面,磁性颗粒, 处理速率不同步:借助于一个中间层 文件系统(FileSystem) 可以实现对磁盘行的文件进行读写 文 ...
- PHOTOSHOP 制作虚线和实线
1.制作实线可以直接用直线工具,选择合适的粗细大小. 2. 制作虚线首先要用钢笔或者绘图工具画出所需要的形状,如弧线,圆形等等 然后在路径面板中用画笔描边,画笔需要提前设置好粗细和间距,用方形 ...
- android hander 线程用法
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanc ...
- 线程池原理及创建并C++实现
本文给出了一个通用的线程池框架,该框架将与线程执行相关的任务进行了高层次的抽象,使之与具体的执行任务无关.另外该线程池具有动态伸缩性,它能根据执行任务的轻重自动调整线程池中线程的数量.文章的最后,我们 ...
- 51nod1174区间中最大的数
1174 区间中最大的数基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中, ...
- jQuery实现鼠标移到元素上动态提示消息框效果
当光标移动到某些元素上时,会弹出像tips的提示框,这种效果想必大家都有见到过吧,下面有个不错的示例,大家可以感受下 当光标移动到某些元素上时,会弹出像tips的提示框. 复制代码代码如下: < ...
- shell脚本加不加export的区别
加了export: jackyyu@ubuntu:~$ cat 1.sh #!/bin/dash test=test echo ${test} echo ${TERM} TERM=dumb expor ...
- LBS地理位置距离计算方法之geohash算法
随着移动终端的普及,很多应用都基于LBS功能,附近的某某(餐馆.银行.妹纸等等).基础数据中,一般保存了目标位置的经纬度:利用用户提供的经纬度,进行对比,从而获得是否在附近.这里需要在设置出一个字段, ...
- R语言语法笔记
## 1. 数据输入 ## a$b # 数据框中的变量 a = 15 # 赋值 a <- 15 # 赋值 a = c(1,2,3,4,5) # 数组(向量) b = a[1] # 数组下标,从1 ...
- struts2处理.do后缀的请求
默认情况下,struts2是无法处理以.do为后缀的请求url的(默认情况下是.action或者不填,可以参见org.apache.struts2包下的default.properties文件). 但 ...