StreamCQL编写jstorm拓扑任务入门

一,什么是 StreamCQL
StreamCQL(Stream Continuous Query Language)是一个类似SQL的声明式语言, 目的是在流计算平台(目前也就是jstrom)的基础之上提供简单易用的类SQL语言,从而能够降低开发人员开发流计算拓扑的门槛,使得相关拓扑任务的开发人员能够不用把精力耗费在如何编写实时任务的本身的技术之上,而是可以投入更多精力在实时任务的业务逻辑实现上.
 
二,StreamCQL的一些概念
1.流:
流是一组(无穷)元素的集合,流上的每个元素都属于同一个schema;每个元素都和逻辑时间有关;即流包含了元组和时间的双重属性。
流上的任何一个元素,都可以用Element<tuple,Time>的方式来表示,tuple是元组,包含了数据结构和数据内容,Time就是该数据的逻辑时间。
 
2.窗口:
窗口(window)是流处理中解决事件的无边界(unbounded)及流动性的一种重要手段,把事件流在某一时刻变成静态的视图,以便进行类似数据库表的各种查询操作。
在stream上可以定义window,窗口有两种类型,时间窗口(time-based)和记录窗口(row-based)。两种窗口都支持两种模式,滑动(slide)和跳动(tumble)。
 
3.表达式:
符号和运算符的一种组合,CQL解析引擎处理该组合以获取单个值。简单表达式可以是常量、变量或者函数,可以用运算符将两个或者多个简单表达式联合起来构成更复杂的表达式。
 
三.StreamCQL的编写流程
1.CQL语句式是以应用程序作为一个整体运行的,一个submit命令代表的是一整个应用程序的结束.
2.一个应用程序中可以包含 用户自定义参数,文件,jar包,函数等,还必须包含至少一个输入流,输出流和数据计算语句.
3.CQL语句并不严格要求各个不同语句的提交顺序,但是用户必须保证流(或者函数,参数等)在使用之前被定义.
 
下面为一个具体用例:
 
--输入流
CREATE INPUT STREAM s1
(name STRING,count INT)
SOURCE KafkaInput
PROPERTIES("zookeepers" ="192.168.1.1:2181","prefix"="/meta","topic"="input_test","groupId"="kafkaConsumer1");
 
--输出流
CREATE OUTPUT STREAM s2
(name2 STRING,count2 INT)
SOURCE KafkaOutput
PROPERTIES("zookeepers" ="192.168.1.1:2181","prefix"="/meta","topic"="output_test");
 
--查询语句
INSERT INTO STREAM s2 SELECT name as name2,sum(count) as count2 FROM s1[RANGE 60 SECONDS BATCH] GROUP BY name;
 
--命令语句
SUBMIT APPLICATION demo1;
 
 
四 ,StreamCQL的数据类型
StreamCQL支持 十一种数据类型,和java的数据类型基本一一对应
 

 

 
cql的数据类型一般使用在 输入/输出语句定义上,cql生成的拓扑任务代码中会将对应的数据转换为指定的数据类型.
 
五,StreamCQL的语法
下面,我们会详细介绍之前的代码用例
首先我们的用例比较简单,就是从 kafka中读取数据,数据格式为jason字符串(我们默认使用json的数据解析器),然后以60秒为一个窗口进行数据统计,然后将统计结果写入kafka的另外一个topic进行输出.
 
1) 首先,我们先创建一个输入流, 我们要进行计算的数据是从这个输入流获取的.
CREATE INPUT STREAM s1 //在这里指定输入流的名称 ,也就是 s1
(name STRING,count INT) //指定输入的数据流的字段以及类型,因为我们默认使用的json解析器,所以 数据文本类似 {"name":"xxxx","count":123}
SOURCE KafkaInput //指定数据源,我们这里也就是指定是kafka的输入源(需要注意一下,这里的kafka数据源是我们自定义的,所以和官网原版的属性有些区别,但这个不会影响我们分析代码)
PROPERTIES("zookeepers" ="192.168.1.1:2181","prefix"="/meta","topic"="input_test","groupId"="kafkaConsumer1");//设置 kafka的一些属性
 
2)然后,我们可以创建输出流,用来输出计算的结果,数据的序列化方式我们默认为json
CREATE OUTPUT STREAM s2 //在这里指定输出流的名称 ,也就是 s2
(name2 STRING,count2 INT) //指定输入的数据流的字段以及类型
SOURCE KafkaOutput //指定输出流的数据源类型为kafka
PROPERTIES("zookeepers" ="192.168.1.1:2181","prefix"="/meta","topic"="output_test");
 
3) 再然后,就是进行 任务的实时计算逻辑
INSERT INTO STREAM s2 SELECT name as name2,sum(count) as count2 FROM s1[RANGE 60 SECONDS BATCH] GROUP BY name;
上面一个语句的逻辑就是 从 输入流 s1 中 读取 name 和 count ,然后以 60秒 的长度为时间窗口长度 , 对这六十秒时间窗口内相同 name字段的count值进行求和,然后将统计结果 输出给 输出流s2
 
4) 最后,我们提交这个拓扑任务
SUBMIT APPLICATION demo1; //拓扑任务名为 demo1
执行完这句话 ,我们才会对上面的 cql语句进行解析和生成拓扑任务并提交到jstorm集群.
 
 
 
 
 
 
 
 

posted @ 2017-12-27 14:37  神州优车技术  阅读(813)  评论(0编辑  收藏  举报