由于项目需要,我开始了学习Esper的任务。刚开始觉得他是个很高级的东西,学了一段时间后发现他确实是很高级的东西。不过貌似在国内的应用很少,网上都查不到什么资料的,所以我觉得在博客里写一下自己的学习的收获,一是总结所学知识点,二是分享给更多的学习者,毕竟好东西不能这样被埋没了。今天就先来简单介绍一下Esper是什么玩意儿。

说到Esper,不得不说一下CEP。CEP即Complex Event Process,中文意思就是“复杂事件处理”。听起来好像很复杂,实际上就是基于事件流进行数据处理,把要分析的数据抽象成事件,然后将数据发送到CEP引擎,引擎就会根据事件的输入和最初注册的处理模型,得到事件处理结果。

有人可能要问了,这和Hadoop有什么区别?可是本人不才,没学过Hadoop,虽然说赶上了这阵风,但是从很多人那了解以后,觉得不过就是个不是特别成熟的工具,然后各个公司要根据需求对Hadoop进行二次开发,就需要懂得源码的人。所以就没打算学了,一个工具而已,等到自己确实有空的时候再学也不迟。至于CEP和Hadoop的区别,应该是Esper和Hadoop的区别,我的理解是:Hadoop适合做事后分析,而Esper适合实时分析。Hadoop我确实不是很了解,如果有问题还希望大家指正。

CEP是一种标准,Esper只是对这个标准的一种开源实现。除了Esper,很多大公司也有类似的商业软件,比如IBM,Sybase等等,听说巨贵无比。CEP的一个重要特点就是他是一个内存计算工具和类SQL语句。内存计算可以说是一把双刃剑。好处自不必说,一个字:快!坏处也显而易见,数据有丢失的风险,而且还有容量的限制(实时计算其实并不受制于内存大小,而是得看如何对实时进行定义,也就是具体的业务来决定了)。所以如果业务不能容忍数据丢失,那么高可用方案就必须做好,不过Esper的高可用很不好做,后面我将会说到。

CEP的类SQL语句,可以理解为处理模型的定义与描述。这是运行在CEP引擎中的特殊语句,之所以叫他类SQL,是因为它和SQL确实很像,除了select,insert,delete,update,而且也有avg,count等函数。所以对于会SQL的人来说,他的语法结构大致还是能猜出一二的。在Esper中,这个句子叫做EPL,即Event Process Language。作为Esper的核心内容,对于它的讲解有三四百页的英文文档,所以之后我会慢慢向大家细细说明的。

下面就简单写个列子给大家看看吧。场景是计算3个苹果的平均价格

[java] view plaincopyprint?
  1. package test;
  2. import com.espertech.esper.client.EPAdministrator;
  3. import com.espertech.esper.client.EPRuntime;
  4. import com.espertech.esper.client.EPServiceProvider;
  5. import com.espertech.esper.client.EPServiceProviderManager;
  6. import com.espertech.esper.client.EPStatement;
  7. import com.espertech.esper.client.EventBean;
  8. import com.espertech.esper.client.UpdateListener;
  9. /**
  10. *
  11. * @author luonanqin
  12. *
  13. */
  14. class Apple
  15. {
  16. private int id;
  17. private int price;
  18. public int getId()
  19. {
  20. return id;
  21. }
  22. public void setId(int id)
  23. {
  24. this.id = id;
  25. }
  26. public int getPrice()
  27. {
  28. return price;
  29. }
  30. public void setPrice(int price)
  31. {
  32. this.price = price;
  33. }
  34. }
  35. class AppleListener implements UpdateListener
  36. {
  37. public void update(EventBean[] newEvents, EventBean[] oldEvents)
  38. {
  39. if (newEvents != null)
  40. {
  41. Double avg = (Double) newEvents[0].get("avg(price)");
  42. System.out.println("Apple's average price is " + avg);
  43. }
  44. }
  45. }
  46. public class Test {
  47. public static void main(String[] args) throws InterruptedException {
  48. EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();
  49. EPAdministrator admin = epService.getEPAdministrator();
  50. String product = Apple.class.getName();
  51. String epl = "select avg(price) from " + product + ".win:length_batch(3)";
  52. EPStatement state = admin.createEPL(epl);
  53. state.addListener(new AppleListener());
  54. EPRuntime runtime = epService.getEPRuntime();
  55. Apple apple1 = new Apple();
  56. apple1.setId(1);
  57. apple1.setPrice(5);
  58. runtime.sendEvent(apple1);
  59. Apple apple2 = new Apple();
  60. apple2.setId(2);
  61. apple2.setPrice(2);
  62. runtime.sendEvent(apple2);
  63. Apple apple3 = new Apple();
  64. apple3.setId(3);
  65. apple3.setPrice(5);
  66. runtime.sendEvent(apple3);
  67. }
  68. }
package test;import com.espertech.esper.client.EPAdministrator;
import com.espertech.esper.client.EPRuntime;
import com.espertech.esper.client.EPServiceProvider;
import com.espertech.esper.client.EPServiceProviderManager;
import com.espertech.esper.client.EPStatement;
import com.espertech.esper.client.EventBean;
import com.espertech.esper.client.UpdateListener;/*** * @author luonanqin**/
class Apple
{private int id;private int price;public int getId(){return id;}public void setId(int id){this.id = id;}public int getPrice(){return price;}public void setPrice(int price){this.price = price;}
}class AppleListener implements UpdateListener
{public void update(EventBean[] newEvents, EventBean[] oldEvents){if (newEvents != null){Double avg = (Double) newEvents[0].get("avg(price)");System.out.println("Apple's average price is " + avg);}}}
public class Test {public static void main(String[] args) throws InterruptedException {EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();EPAdministrator admin = epService.getEPAdministrator();String product = Apple.class.getName();String epl = "select avg(price) from " + product + ".win:length_batch(3)";EPStatement state = admin.createEPL(epl);state.addListener(new AppleListener());EPRuntime runtime = epService.getEPRuntime();Apple apple1 = new Apple();apple1.setId(1);apple1.setPrice(5);runtime.sendEvent(apple1);Apple apple2 = new Apple();apple2.setId(2);apple2.setPrice(2);runtime.sendEvent(apple2);Apple apple3 = new Apple();apple3.setId(3);apple3.setPrice(5);runtime.sendEvent(apple3);}
}

很简单的例子,虽然没有加注释,也应该很好懂吧。大家可以自己运行一下看看是什么结果。

Esper的官网:http://esper.codehaus.org/ 里面有很多例子可以研究一下。

Esper学习之一:Esper介绍 .相关推荐

  1. Esper学习之五:EPL语法(一)

    转载请注明出处:http://blog.csdn.net/luonanqin 上篇说到了Esper的Context,要是不了解的同学请参看< Esper学习之四:Context >,看过的 ...

  2. Esper学习之二:事件类型 .

    上周我们介绍了Esper,它是一个适合实时分析数据的内存计算引擎.若有不了解的同学可以看一下 Esper学习之一:Esper介绍.如果各位自己运行过之前的程序,应该对Esper的处理机制和EPL比较感 ...

  3. Esper学习之三:进程模型 .

    之前对Esper所能处理的事件结构进行了概述,并结合了例子进行讲解,不清楚的同学请看Esper学习之二:事件类型.今天主要为大家解释一下Esper是怎么处理事件的,即Esper的进程模型. 1.Upd ...

  4. Esper学习之十二:EPL语法(八)

    今天的内容十分重要,在Esper的应用中是十分常用的功能之一.它是一种事件集合,我们可以对这个集合进行增删查改,所以在复杂的业务场景中我们肯定不会缺少它.它就是Named Window. 由于本篇篇幅 ...

  5. Esper学习之九:EPL语法(五)

    转载请注明出处:http://blog.csdn.net/luonanqin 暂停更新三个多月,转眼间就2014年了.年底相信都是大家最忙碌的时候,我也不例外,以至于真的是没腾出手来继续更新,好在年初 ...

  6. camvid数据集介绍_深度学习图像数据集介绍(MSCOCO)

    深度学习图像数据集介绍(MSCOCO) MSCOCO数据集是微软开发维护的大型图像数据集,次数聚集的任务包括识别(recognition),分割(segementation),及检测(detectio ...

  7. 《从0到1学习Flink》—— 介绍Flink中的Stream Windows

    前言 目前有许多数据分析的场景从批处理到流处理的演变, 虽然可以将批处理作为流处理的特殊情况来处理,但是分析无穷集的流数据通常需要思维方式的转变并且具有其自己的术语(例如,"windowin ...

  8. [深度学习] 分布式Horovod介绍(四)

    [深度学习] 分布式模式介绍(一) [深度学习] 分布式Tensorflow介绍(二) [深度学习] 分布式Pytorch 1.0介绍(三) [深度学习] 分布式Horovod介绍(四) 实际应用中, ...

  9. [深度学习] 分布式Pytorch介绍(三)

    [深度学习] 分布式模式介绍(一) [深度学习] 分布式Tensorflow介绍(二) [深度学习] 分布式Pytorch介绍(三) [深度学习] 分布式Horovod介绍(四)  一  Pytorc ...

  10. [深度学习] 分布式模式介绍(一)

    [深度学习] 分布式模式介绍(一) [深度学习] 分布式Tensorflow介绍(二) [深度学习] 分布式Pytorch 1.0介绍(三) [深度学习] 分布式Horovod介绍(四) 一  分布式 ...

最新文章

  1. R程序设计中的IF、IFELSE、SWITCH
  2. Java中关于==和equal的区别 以及equals()方法重写
  3. 【知识发现】基于用户的协同过滤推荐算法python实现
  4. java自定义jsp标签_深入浅出javaWeb实战第17讲自定义JSP标签(上)
  5. 【Boost】系列03:内存管理之shared_ptr智能指针
  6. 我如何预测10场英超联赛的确切结果
  7. dashboard windows 前端开发环境搭建
  8. Java中Object转换为List类型
  9. 锁定Mac的键盘:连击5次option键
  10. sstv解码_SSTV通联活动:ISS国际空间站2020年1月30日和1月31日
  11. app测试用例考虑点
  12. MATLAB eof用法,[转载]基于Matlab软件进行EOF分解、回归趋势分析
  13. STVD环境下开发STM8,如何查看工程占用的Flash、EEPROM、RAM的情况
  14. CBv92_GSHI 使用技巧、电脑输CBC码、金手指分区数据复制和备份
  15. mysql查询最大packet_mysql max_allowed_packet 查询和修改
  16. 用diiv实现多个方块居中嵌套--margin
  17. 手把手带你实现 Docker 部署 Redis 集群
  18. 前端 vue 解决按1920*1080设计图做的页面适配屏幕缩放并适配4K屏
  19. 百度VR智拍再升级,3D环物拍摄一站生成
  20. 操作系统基础教程——第六章课后答案

热门文章

  1. linux 查找 文件夹内 函数
  2. Boostnote笔记+坚果云|实现在线markdown笔记同步
  3. react h5 自定义数字+大写字母键盘
  4. 立体绿化成城市新宠,究竟有何优势?
  5. day03 - vue基础
  6. 索尼手机鸿蒙,华为P50三大硬核配置确认!新麒麟、新鸿蒙、新索尼:不再神秘...
  7. RecycleView-ListView优化
  8. Github自定义个人首页
  9. 初入Python-提升PV数(提升浏览量)
  10. ​力扣解法汇总856. 括号的分数