一,什么是 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. Json解析封装GsonUtil

    感觉Json解析都快谈不上一门技术了,在Android Studio上可以直接使用JsonFormat插件,一键就解析出Json所转换的Javabean,再配合GsonUtil的使用,Json解析的步 ...

  2. Gluon炼丹(Kaggle 120种狗分类,迁移学习加双模型融合)

    这是在kaggle上的一个练习比赛,使用的是ImageNet数据集的子集. 注意,mxnet版本要高于0.12.1b2017112. 下载数据集. train.zip test.zip labels ...

  3. 微信小程序与Java后台通信

    一.写在前面 最近接触了小程序的开发,后端选择Java,因为小程序的代码运行在腾讯的服务器上,而我们自己编写的Java代码运行在我们自己部署的服务器上,所以一开始不是很明白小程序如何与后台进行通信的, ...

  4. Django 2.0 新特性 抢先看!

    一.Python兼容性 Django 2.0支持Python3.4.3.5和3.6.Django官方强烈推荐每个系列的最新版本. 最重要的是Django 2.0不再支持Python2! Django ...

  5. Struts 2 入门

    Struts 2  入门: 一:Struts 2执行流程: 1 客户端发送请求: 2这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤 ...

  6. 用python批量修改文件名

    从youtube上当下来百来首mv,每个都需要去掉视频,这还挺好弄得,格式工厂一弄就完了,但是文件名,都带有乱七八糟的*啥的巴拉巴拉的,咋修改啊,几百首总不可能一个一个rename吧 #批量修改文件名 ...

  7. thinkphp5源码解析(1)数据库

    前言 tp5的数据库操作全部通过Db类完成,比较符合国人的习惯,比如简单的Db::query().Db::execute(),还有复杂的链式操作Db::where('id=1')->select ...

  8. Nginx如何配置虚拟主机?

    注意,该环境是依赖于http://www.php20.com/forum.php?m ... &extra=page%3D1 基础上进行配置.默认不具备这些文件 .下面是增加一个mytest点 ...

  9. 框架原理第一讲,熟悉常用的设计方式.(以MFC框架讲解)

    框架原理第一讲,熟悉常用的设计方式.(以MFC框架讲解) 一丶什么是框架,以及框架的作用 什么是框架? 框架,简而言之就是把东西封装好了,使用框架开发可以快速开发程序,例如MFC程序的双击写代码. 为 ...

  10. Linux上跑两个版本的php,5.4.45和5.3.24

    首先,装的实在艰难,所以容我吐槽两句: PHP好个P,两个小版本都不兼容,把这个php5.3.24放在5.4.45环境下都跑不了.对于我这种用多了向下兼容的java的人来说,简直无法想象! 网上有装俩 ...