一,什么是 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. Activity 的 4 种加载模式

    Activity 的 4 种加载模式 配置 Activity 时可指定 android:launchMode 属性,该属性用于配置该 Activity 的加载模式.该属性支持如下 4 个属性值. * ...

  2. 常用IO按位操作

    PORTD |= (1 << op)           //位置高PORTD &= ~(1 << op)          //位置低PORTD ^= (1 < ...

  3. 匿名HTTP透明HTTP高匿HTTP区别

    透明代理的意思是客户端根本不需要知道有代理服务器的存在,但是它传送的仍然是真实的IP.你要想隐藏的话,不要用这个. 普通匿名代理能隐藏客户机的真实IP,但会改变我们的请求信息,服务器端有可能会认为我们 ...

  4. 洛谷教主花园dp

    洛谷-教主的花园-动态规划   题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价 ...

  5. 自己动手实现mvc框架

    用过springmvc的可能都知道,要集成springmvc需要在web.xml中加入一个跟随web容器启动的DispatcherServlet,然后由该servlet初始化一些东西,然后所有的web ...

  6. 简单的基于Vue-axios请求封装

    具体实现思路=>封装之前需要用npm安装并引入axios,使用一个单独的js模块作为接口请输出对象,然后export dafult 这个对象. 1.首先我们需要在Vue实例的原型prototyp ...

  7. angularjs 给封装的模态框元素传值,和实现兄弟传值

    本例实现封装的元素所放的位置不同,而选择不同的传值,这里举例封装了bootstrap模态框,以后也方便大家去直接使用.方法举例如下:首先主页调用css/js有: <link rel=" ...

  8. eclipse修改内存大小

    一般安装完eclipse之后,在安装目录下你应该可以看到有一个 eclipse.ini 文件,对了,就是在这个文件里面修改,我打开同事机器上这个文件,里面的内容是: -vmargs-Dosgi.spl ...

  9. oracle恢复已删除的表

    drop 误删除表之后使用flashback table tablename to before drop 可恢复或者使用flashback table "BIN$gcfME7ObTx+n0 ...

  10. poj 1318Word Amalgamation

    题目链接:http://poj.org/problem?id=1318 /*题意:在字母乱序的单词里面找到字母相同的字典里面的单词*/ /*此题的主要思路是要将字符排序,然后找对应,如果相同,那么就将 ...