zoukankan      html  css  js  c++  java
  • NESPER的大体结构 z

    NEsper从内容上分为两块,NEsper的核心NEsper.dll和NEsper.IO.dll。

    (1)NEsper的核心包包含了EPL语法解析引擎,事件监听机制,事件处理等核心模块。

    (2)NEsper的io包含从各种数据源读取数据以及将输出结果写入各种数据源,包括excel,database,msmq,http,socket,XML。

    贴一张esper官网上的结构图,方便大家了解esper的结构

    nesper

    接下来对上述结构图进行详细的解释让大家加深对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的平均值

    以上这些都比较容易理解,虽然知道了处理方法,也比较好用,我还是比较喜欢钻研一下他的内部实现方式。先来看一张时间窗口模式的图

    image

    他仅保留最近时间窗口的对象内容,但是每个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)

    时间批量模式的操作图如下

    nesperbatchtime

    上图的时间窗口大小为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语句就可以了,方便快捷,对大部分的系统还是比较适合的。

  • 相关阅读:
    Neko's loop HDU-6444(网络赛1007)
    Parameters
    SETLOCAL
    RD / RMDIR Command
    devenv 命令用法
    Cannot determine the location of the VS Common Tools folder.
    'DEVENV' is not recognized as an internal or external command,
    How to change Visual Studio default environment setting
    error signing assembly unknown error
    What is the Xcopy Command?:
  • 原文地址:https://www.cnblogs.com/zeroone/p/3660209.html
Copyright © 2011-2022 走看看