一,什么是 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集群.
 
 
 
 
 
 
 
 

StreamCQL编写jstorm拓扑任务入门的更多相关文章

  1. HDU 1285 经典拓扑排序入门题

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  2. (转)在 vue-cli 脚手架中引用 jQuery、bootstrap 以及使用 sass、less 编写 css [vue-cli配置入门]

    写在前面: 本文是vue-手摸手教你使用vue-cli脚手架-详细步骤图文解析之后,又一篇关于vue-cli脚手架配置相关的文章,因为有些文章步骤不够清晰,当时我引入JQuery.bootstrap的 ...

  3. 拓扑排序入门详解&&Educational Codeforces Round 72 (Rated for Div. 2)-----D

    https://codeforces.com/contest/1217 D:给定一个有向图,给图染色,使图中的环不只由一种颜色构成,输出每一条边的颜色 不成环的边全部用1染色 ps:最后输出需要注意, ...

  4. POJ 2367 Genealogical tree 拓扑排序入门题

    Genealogical tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8003   Accepted: 5184 ...

  5. poj 2367 拓扑排序入门

    Description The system of Martians' blood relations is confusing enough. Actually, Martians bud when ...

  6. 【转载】ubuntu下编写字符设备驱动程序-入门篇

    在ubuntu初学驱动,觉得挺有用的. http://www.eefocus.com/jefby1990/blog/13-02/291628_c39b8.html

  7. Matlab(3) -- 编写M文件(函数)

    转自:http://blog.csdn.net/misskissc/article/details/8178089 matlab的命令编辑窗口(Command Window)界面主要是用来调用系统命令 ...

  8. Xamarin.Android之UI Test简单入门

    一.前言 相信Xamarin免费之后会有更多的人加入进来,这也是我一直以来最希望看到的事,更多的人加入到这个社区中,为这个社区贡献自己的一份力量,国内当前还没有一个比较正规或者说是名气比较大的Xama ...

  9. [书目20160624]Android应用开发从入门到精通

    卢海东 著 第1章 揭开神秘面纱——Android系统简介 1   1.1 认识Android系统 2   1.1.1 Android成长历程 2   1.1.2 发行版本 3   1.1.3 得到大 ...

随机推荐

  1. ubuntu下mysql提示Changed limits: max_open_files:1024解决办法

    在配置我的md5解密网站cmd5.la的时候,mysql5.7出现了max_open_files: 1024, max_connections: 214,warning: Changed limits ...

  2. (转载) Java子类与父类之间的对象转换

    在使用Java的多态机制时,常常使用的一个特性便是子类和父类之间的对象转换.从子类向父类的转换称为向上转换(upcasting),通过向上转换,我们能够在编写程序时采用通用程序设计的思想,在需要使用子 ...

  3. VMWare安装Win10虚拟机

    这两天突发奇想安了个win10虚拟机,在安装的过程中还遇到了不少麻烦,所以在此与大家分享下. 首先我们用VMWare12来安装,VMWare已经更新到14但是不太稳定,所以为了保险起见还是用12吧. ...

  4. python爬虫实战 获取豆瓣排名前250的电影信息--基于正则表达式

    一.项目目标 爬取豆瓣TOP250电影的评分.评价人数.短评等信息,并在其保存在txt文件中,html解析方式基于正则表达式 二.确定页面内容 爬虫地址:https://movie.douban.co ...

  5. ThinkPHP 5 中AJAX跨域请求头设置方法

    最近用thinkphp做项目,在测试环境时,存在接口的测试问题.在tp官网也没能找到相关的解决方法.自已看了一下源码,有如下的解决方案. 在项目目录下面,创建common/behavior/CronR ...

  6. springCloud zuul网关服务

    第一步:编写application.properties文件 spring.application.name=api-gateway server.port=5555 zuul.routes.user ...

  7. arguments.callee的临时指向特性

    function r(){ alert('BBB'); } var a = { f: function(){ alert('AAA'); arguments.callee = r; } }; 弹出的都 ...

  8. python3 爬虫---爬取糗事百科

    这次爬取的网站是糗事百科,网址是:http://www.qiushibaike.com/hot/page/1 分析网址,参数''指的是页数,第二页就是'/page/2',以此类推... 一.分析网页 ...

  9. Ubuntu使用之Svn命令小技巧

    注: [svn Path]:是指要代替码分支的server绝对路径 [Path]:是指终端相对当前文件夹的相对路径.假设是在当前文件夹下,就省略路径 ①.取svnserver的代码: svn co [ ...

  10. 怎样解决jsp:include标签在包括html文件时遇到的乱码问题

    在一个JSP页面中,经常须要包括还有一个文件,JSP为我们提供了jsp:include标签能够完毕这个功能,比方:<jsp:include page="some.jsp"&g ...