SODBASE实时大数据基础(二):类SQL语言EPL与Storm或jStorm集成
来源:互联网 发布:mac jdk默认安装路径 编辑:程序博客网 时间:2024/05/17 01:59
互联网+的影响力就是大,storm框架原本是设计用来做互联网短文本处理和一些统计工作的,借着互联网的东风越来越多地被大家使用。在一些场合,特别是在已经用了storm架构以后,发现又想用EPL语句,storm和类SQL语言EPL结合也不失为一种方案。对在线规则修改、窗口数据可靠性要求高的地方还有用专用的CEP集群方案、Hot-Hot HA等方案可供选择,不过这些不是本文的重点。本文的重点就是让storm插上EPL的翅膀,轻松解决一些实际项目中的拦路虎。
1.示例操作步骤
前3步是安装Storm(或jStorm),已经安装了Storm(或jStorm)的读者可以跳过,直接到第4步。
(1)下载安装jdk
(2)下载安装 zookeeper,启动zookeeper
exportZOOKEEPER_HOME="/path/to/zookeeper"
exportPATH=$PATH:$ZOOKEEPER_HOME/bin
cp/usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
zkServer.sh start
(3)下载storm,
http://mirrors.hust.edu.cn/apache/storm/apache-storm-0.9.4/apache-storm-0.9.4.zip
解压到linux服务器相应位置,也可以下载其它版本。
(4)EPL引擎配置目录,
下载Storm-EPL-Example 压缩包,解压是一个Eclipse工程
cep_home目录拷贝到storm的目录中,如apache-storm-0.9.4/cep_home。这个目录也可以自定义,需修改EPLExampleTopology.java代码中的cep_home变量的值。
lib/sodbasecep/目录下jar文件拷贝到storm的lib目录下
dist目录下的cep-application-storm-example.jar拷贝到storm的examples目录下
注:使用jStorm的读者,配置方法和Storm一致,本系列文章中在Storm上运行EPL的示例可以同时在Storm和jStorm上运行。
(5)启动storm
# bin/storm nimbus &
# bin/stormsupervisor &
(6)运行Topology
运行命令启动topology
bin/storm jar examples/cep-application-storm-example.jar com.sodbase.integration.storm.EPLExampleTopology
(7)输出结果(本示例的功能是IT系统监控中的分析函数调用响应时间,是否超时)
2. 工作原理
Storm中使用SQL,较为简便的方法就是使用EPLBolt。这种类型的一个Bolt就代表着一个SQL(EPL)语句,有时也能代表多个SQL语句。
2.1 EPL建模
首先,建议大家用Studio建模,建模后导出为XML文件,能大大提高建模速度。本例的EPL XML文件在files目录下的calltimeout.xml
EPL的输入流名称使用com.sodbase.inputadaptor.StubInputAdaptor进行声明,从而在EPL中可以使用。
EPL的输出流使用com.sodbase.outputadaptor.storm.SodbaseCepStromOutputAdaptor适配器
<outputAdaptors> <isOutputAsSelection>true</isOutputAsSelection> <outputAdaptorClassName>com.sodbase.outputadaptor.storm.SodbaseCepStormOutputAdaptor</outputAdaptorClassName> <isExternal>false</isExternal> <queryName>calltimeoutnotification</queryName> </outputAdaptors>
查询响应时间的语句
CREATE QUERY callnottimeout SELECT T2._start_time_-T1._start_time_ AS responsetime, T1.callerid AS functionname ,'false' AS timeout FROM T1:callstream,T2:callstream PATTERN T1&T2 WHERE T1.callerid=T2.callerid AND T1.eventtype ='start' AND T2.eventtype ='end' WITHIN 1000查询超时的语句
CREATE QUERY calltimeoutnotification SELECT '-1' AS responsetime, T1.callerid AS functionname,'true' AS timeout FROM T1:callstream,T2:callstream,T3:calltimeoutevent PATTERN T1;!T2;T3 WHERE T3._end_time_-T1._end_time_=1000 AND T2.callerid=T3.callerid AND T1.eventtype='start' WITHIN 1000
CREATE QUERY calltimeout SELECT 'timer' AS type,T1.time AS time,T1.callerid AS callerid FROM T1:callstream PATTERN T1 WHERE T1.eventtype ='start' WITHIN 0
<outputAdaptors> <isOutputAsSelection>true</isOutputAsSelection> <outputAdaptorClassName>com.sodbase.outputadaptor.timer.FixedDelayTimerOutputAdaptor</outputAdaptorClassName> <adaptorParams>calltimeoutevent</adaptorParams> <adaptorParams>1000</adaptorParams> <isExternal>false</isExternal> <queryName>calltimeout</queryName></outputAdaptors>
将EPL引擎的处理结果传到EPLBolt的下一个bolt中。
2.在storm中使用EPL模型
(1)将EPL需要的包拷贝到storm的lib目录下,再启动nimbus和supervisor
sodbase-cep-engine.jar sodbase-dataadaptor-storm.jar sodbase-dataadaptor-timer.jar sodbase-studio.jar xalan-2.7.1.jar xercesImpl-2.9.1.jar xml-apis-1.3.04.jar
(2)在storm目录下建一个目录cep_home,存放EPL引擎的配置文件和日志。把configuration文件夹、logging.properties放到cep_home下面。cep_home的路径可以自定义,和下面EPLExampleTopology 代码中一致即可。
(3)EPL XML模型文件放到放到cep_home/files目录下,位置也可自定义,要和下面EPLExampleTopology 代码中一致。
(4)编写Topology应用EPLExampleTopology, 代码如下
public class EPLExampleTopology { public static void main(String[] args) throws Exception { TopologyBuilder builder = new TopologyBuilder(); builder.setSpout("event", new RandomEventSpout(), 1); //TODO: to specify stream name that EPL uses, and the output fields Fields outputFields = new Fields("functionname","responsetime","timeout"); String cep_home="/user/apache-storm-0.9.4/cep_home"; String cepmodelfile="/user/apache-storm-0.9.4/cep_home/files/calltimeout.xml"; builder.setBolt("EPL", new EPLBolt("callstream",outputFields,cep_home,cepmodelfile), 1).shuffleGrouping("event"); builder.setBolt("print1", new PrintBolt(), 1).shuffleGrouping("EPL"); Config conf = new Config(); conf.setDebug(false); if (args != null && args.length > 0) { conf.setNumWorkers(3); StormSubmitter.submitTopology(args[0], conf, builder.createTopology()); } else { LocalCluster cluster = new LocalCluster(); cluster.submitTopology("test", conf, builder.createTopology()); Utils.sleep(10000); cluster.killTopology("test"); cluster.shutdown(); } }}
builder.setBolt("EPL", new EPLBolt("callstream",outputFields,cep_home,cepmodelfile), 1).shuffleGrouping("event");
表示将"event" Spout的输出,接到EPL引擎的streamname "callstream",输出outputFieds。用了EPLBolt专门处理EPL语句,构造函数有4个参数
streamname:与EPL模型中StubInputAdaptor的名称对应
outputFields:Bolt的输出字段,应与EPL模型中SELECT语句一致
cep_home:EPL引擎配置文件和日志文件目录
cepmodelfile:EPL XML模型文件的路径
(5)EPLExampleTopology的RandomEventSpout和PrintBolt
RandomEventSpout提供调用开始结束事件模拟数据的spout
public class RandomEventSpout extends BaseRichSpout { SpoutOutputCollector _collector; Random _rand; @Override public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) { _collector = collector; _rand = new Random(); } @Override public void nextTuple() { int functionid=_rand.nextInt(10000); String a = "function-"+functionid; String b = "start"; _collector.emit(new Values(a,b)); Utils.sleep(500); if(functionid%2==0) { b = "end"; _collector.emit(new Values(a,b)); } } @Override public void ack(Object id) { } @Override public void fail(Object id) { } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("callerid","eventtype")); }}PrintBolt作用是屏幕打印输出
public class PrintBolt extends BaseRichBolt { OutputCollector _collector; public void prepare(Map conf, TopologyContext context, OutputCollector collector) { _collector = collector; } public void execute(Tuple tuple) { Fields fields = tuple.getFields(); for(String field:fields) System.out.print(field+": "+tuple.getValueByField(field)); System.out.println(); _collector.ack(tuple); } public void declareOutputFields(OutputFieldsDeclarer declarer) { } }
(6)将Topology打包成jar,在storm中测试运行。
本文示例的功能是监控系统中监测服务调用或系统调用的响应时间,是否超时。
本文的示例也可以到http://www.sodbase.com/page/service/product.php下载最新版软件。
SODBASE 实时大数据软件用于轻松、高效实施数据监测、监控类、交易类、日志分析类项目。EPL语法见SODSQL写法与示例。图形化建模请使用SODBASE Studio。
- SODBASE实时大数据基础(二):类SQL语言EPL与Storm或jStorm集成
- SODBASE CEP学习(四):类SQL语言EPL与Storm或jStorm集成
- SODBASE CEP学习(四)续:类SQL语言EPL与Storm或jStorm集成-滑动窗口
- SODBASE CEP学习(四)续:类SQL语言EPL与Storm或jStorm集成-使用分布式缓存
- SODBASE实时大数据基础(三):SODBASE与Spark streaming集成
- SODBASE CEP学习(五):流式计算中的类SQL语言EPL
- SODBASE实时大数据基础(一):实时同步Mysql数据库到Kafka
- 大数据实时处理storm,jstorm
- SODBASE CEP学习(二):运行第一个EPL例子
- (二) kafka-jstorm集群实时日志分析 之 ---------jstorm集成spring
- JStorm与Storm源码分析(二)--任务分配,assignment
- JStorm与Storm源码分析(二)--任务分配,assignmen
- Storm实时大数据处理(二)
- 在线实时大数据平台Storm集成redis开发(分布锁)
- storm、jstorm 调研系列(一)----jstorm介绍以及与spark的比较,外加一些基础概念
- 大数据之jstorm,storm,hbase,hadoop and so on
- SODBASE CEP学习(十):在线动态修改EPL规则
- SODBASE CEP学习(十三):EPL常用函数
- VS2008动态链接库(DLL)的创建与导入
- 不读书、不吃苦,你要青春干嘛
- MYSQL事务(基础类)
- 【HDU 2063】【二分图最大匹配】过山车
- VS2013MFC对话框工程学习笔记八 - C++关键字(标识符)的学习
- SODBASE实时大数据基础(二):类SQL语言EPL与Storm或jStorm集成
- 通过追女孩时的常见对话来看你会不会聊天
- Hibernate.cfg.xml 配置
- ubuntu如何强制关闭qq和启动qq
- 字符编码笔记:ASCII,Unicode和UTF-8
- Main
- JAVA解析XML文件--SAX方式
- 【NOIP模拟】素数密度
- 从零开始学习jQuery (五) 事件与事件对象