Transwarp Data Hub Version 4.7
StreamSQL使用手册
星环信息科技(上海)有限公司
版本号 T00147-10-010, 2017-01-12
目录
1. Inceptor StreamSQL简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1. StreamSQL的优势 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2. StreamSQL的技术指标 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2. 快速入门 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1. 建Kafka数据源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2. 建Stream及触发StreamJob . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3. 接收并处理Kafka传来的数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4. 停止Streamjob . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3. StreamSQL基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.1. Stream
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.1.1. Input Stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.1.2. Derived Stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2. StreamJob
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.3. Application
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.4. 与普通SQL最大的两个区别 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.4.1. DML SQL背景运行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.4.2. 结果输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4. 交互方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
5. DDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.1. Stream管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.1.1. CREATE STREAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.1.1.1. Kafka为源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
5.1.1.2. Socket为源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5.1.1.3. 复杂数据类型格式的指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5.1.1.3.1. 复杂类型STRUCT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5.1.1.3.2. 复杂类型ARRAY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5.1.1.3.3. 复杂类型MAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.1.1.3.4. 复杂类型TIMESTAMP . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.1.1.4. 自定义用户数据解析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.1.2. CREATE STREAM AS SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.1.2.1. FILTER转化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.1.2.2. WINDOW转化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.1.3. SHOW STREAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.1.4. DESCRIBE STREAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.1.5. ALTER STREAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.1.5.1. 重命名Input Stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.1.5.2. 修改Input Stream属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.1.5.3. 增加Input Stream列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.1.5.4. 替换Input Stream列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.1.6. DROP STREAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.2. Application管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.2.1. CREATE APPLICATION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.2.2. DESCRIBE APPLICATION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.2.3. SHOW CURRENT APPLICATION . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.2.4. ALTER APPLICATION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.2.5. SHOW APPLICATIONS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.2.6. DROP APPLICATIONS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.3. StreamJob管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.3.1. CREATE STREAMJOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.3.2. DESCRIBE STREAMJOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.3.3. ALTER STREAMJOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.3.4. SHOW STREAMJOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.3.5. LIST STREAMJOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.3.6. DROP STREAMJOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
6. DML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
6.1. 窗口 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
6.1.1. 滑动窗口 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
6.1.2. 跳动窗口 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.1.3. 事件时间切分的其他设置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.1.4. 对Window Stream的聚合操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
6.1.5. 流之间的关联 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
6.2. 输出方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
6.2.1. 输出到流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
6.2.2. 输出到表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.2.3. 批量Flush到HDFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.3. 查询:SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.3.1. Ad-hoc查询 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.4. 流不支持的DML
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
7. StreamSQL权限管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
7.1. 授予权限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
7.1.1. 授予全局权限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
7.1.2. 授予database级别权限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
7.1.3. 授予Application级别权限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
7.1.4. 授予Stream级别权限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
7.2. 收回权限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
7.2.1. 收回全局权限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
7.2.2. 收回Database级别权限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
7.2.3. 收回Application级别权限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
7.2.4. 收回Stream级别权限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
7.3. 查看权限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
7.4. StreamSQL操作所需权限总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
8. 运行时管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
8.1. 全局管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
8.1.1. 背压功能(Back Pressure) . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
8.2. Application级别管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
8.3. StreamJob级别管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
9. 高级功能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
9.1. 监控告警 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
9.2. 高可用性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
9.2.1. 开启CheckPoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
9.2.2. 启动Standby InceptorServer . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
9.3. At-Least-Once支持 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
9.4. 自定义参数设置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
9.4.1. Batch duration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
9.4.2. Kafka receiver个数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
9.4.3. Holodesk窗口设置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
9.5. PLSQL
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
9.5.1. 开启流上的PLSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
9.5.2. 开启PLSQL的编译优化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
9.5.3. 禁用print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
9.5.4. 嵌套SELECT需要加 Ad-hoc的hint . . . . . . . . . . . . . . . . . . . . . . . . . 39
9.5.5. 数据库名不允许以数字起始 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
9.5.6. 简单函数示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
9.5.7. 游标示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
10. StreamSQL实战 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
10.1. Application间的资源隔离 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
10.2. 流上的统计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
10.3. 按时间字段切分的多流关联 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
10.4. 流上的PL/SQL
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
10.5. StreamJob的持久化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
10.6. 高级功能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
10.6.1. 邮件警告 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
10.6.2. 高可用性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
10.6.3. Holodesk配置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
11. StreamSQL参数整理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
附录 A: Kafka基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
A.1. 基础概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
A.1.1. Topic和Producer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
A.1.2. Consumer和Consumer Group . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
A.1.3. Replication和Failover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
A.2. Kafka相关脚本的简单使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
A.2.1. 启动Zookeeper和Kafka服务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
A.2.2. 创建Topic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
A.2.3. 查看Topic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
A.2.4. 用Producer发送消息 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
A.2.5. 用Consumer接收消息 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
A.2.6. Kafka权限管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
A.2.6.1. 授予权限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
A.2.6.2. 查看权限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
A.2.6.3. 收回权限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
客户服务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
免责声明
本说明书依据现有信息制作,其内容如有更改,恕不另行通知。星环信息科技(上海)有限
公司在编写该说 明书的时候已尽最大努力保证期内容准确可靠,但星环信息科技(上海)
有限公司不对本说明书中的遗漏、 不准确或印刷错误导致的损失和损害承担责任。具
体产品使用请以实际使用为准。
注释: Hadoop® 和 SPARK® 是ApacheTM 软件基金会在美国和其他国家的商标或注册的
商标。 Java® 是 Oracle公司在美国和其他国家的商标或注册的商标。 Intel®
和Xeon® 是英特尔公司在美国、中国和其他国 家的商标或注册的商标。
版权所有 © 2013年-2017年星环信息科技(上海)有限公司。保留所有权利。
©星环信息科技(上海)有限公司版权所有,并保留对本说明书及本声明的最终解释权和修
改权。本说明书 的版权归星环信息科技(上海)有限公司所有。未得到星环信息科技(上
海)有限公司的书面许可,任何人 不得以任何方式或形式对本说明书内的任何部分进行
复制、摘录、备份、修改、传播、翻译成其他语言、或 将其全部或部分用于商业用
途。
手册版本信息
版本号: T00147-10-010
发布日期: 2017-01-12
Preface | 1
1. Inceptor StreamSQL简介
在4.3版本之前,Transwarp Data Hub(TDH)上的流处理应用必须用Java或者scala开发,这将流处理应用的
开发门槛设置得非常高。从TDH 4.3开始,Transwarp Stream引入全新的StreamSQL使得用户可以通过SQL的方
式实现业务逻辑,大大降低了流应用开发的门槛。所以,星环科技推荐多数用户采用StreamSQL开发流应
用。StreamSQL几乎可以应用于所有业务场景,包括ETL工具,规则报警工具等简单业务场景。对于更复杂的
业务逻辑,用户可以选择使用PLSQL,属于StreamSQL的高级功能。
1.1. StreamSQL的优势
相对于采用编程的方式开发流应用,采用StreamSQL具有以下优势:
• 极高的易用性
以往的流处理平台有较高的入门门槛,比如Spark Streaming,Storm,必须对框架以及流处理本身,甚
至是底层技术比较熟悉的情况下,才能写出高效的流处理程序。这大大地限制了流处理的推广和应用。
而使用StreamSQL,用户只需要有编写普通SQL的经验,就可以写出高效、安全、稳定的流处理应用。
• 性能提升
在一些条件下,采用StreamSQL的方式甚至比编程方式获得更高的性能提升。这是因为StreamSQL做了一
些特殊优化,在编程模式下无法轻易实现。比如,多条针对同一个输入流的SQL只需读取一份数据;增加
迭代框架,使得原本无法利用Spark API进行优化的迭代计算效率大大提升。
• 产品化程度高
通过编程的方式来实现流处理的另一个问题是产品化程度非常低。由于编程有较高的自由度,出现问题
的可能性很大;而又由于编程的方式将流处理平台和用户程序绑定在一起,用户没办法很好地区分是自
己代码的问题还是平台的问题,导致无法及时地分析出错原因。SQL作为一个通用的接口将大大地提高产
品化程度。
• 迁移成本低
用户原有的业务逻辑很多是通过SQL实现的,如果通过编程的方式迁移到流上,迁移成本非常高,还不能
保证迁移后的逻辑是否正确。而一旦采用StreamSQL的方式,用户只需要修改少量SQL,迁移成本几乎接
近零。
1.2. StreamSQL的技术指标
• 99%的ANSI SQL 2003的支持率
为了降低应用迁移成本, StreamSQL使用了完整的SQL编译器,支持ANSI SQL 92和SQL 99标准,并且支
持ANSI SQL 2003 OLAP核心扩展,可以满足绝大部分现有业务对SQL的要求,方便应用平滑迁移。
• 95%的PLSQL Oracle以及PLSQL DB2的支持率
StreamSQL完美兼容PLSQL Oracle 11g 以及PLSQL DB2最新版本,可以满足大多数用户的复杂业务场景。
• 强大的优化器提升性能
2 | 1. Inceptor StreamSQL简介
除了更好的SQL语义分析层以外,StreamSQL包含强大的优化器保证SQL在引擎上有最佳的性能。包含3级
优化器:首先是基于规则的优化器,应用静态优化规则并生成一个逻辑执行计划,其次是基于成本的优化
器,通过衡量多个不同执行计划的CPU,IO和网络成本,来选择一个更合理的计划并生成物理执行计划;最
后是代码生成器,对一些比较核心的执行逻辑生成更高效的执行代码或者Java Byte Code,从而保证SQL
业务在分布式平台上有最佳性能。
• 支持按数据字段时间切分滑动窗口和跳动窗口
常见的流框架一般只针对系统时间做窗口切分,但这往往达不到实际应用的要求。因此,StreamSQL实现
了复杂内部逻辑,使得用户通过简单的SQL语法就能指定特定数据字段作为窗口的依据。用户可以通过
与SQL 2003兼容的Window语法来创建滑动窗口或者跳动窗口,并在窗口上进行各种复杂的聚合操作。
• 支持多种输出方式
包括Hyperbase,Hive以及Holodesk等。
• 支持企业数据总线
从一个流读入数据,再将其输入另一个流,比如一个常见的企业数据总线以Kafka为存储中间件。
• 支持运行时隔离
保证多用户安全、稳定运行各自StreamSQL。原来流处理应用要么物理上完全隔离,但无法共享硬件资源
也不方便管理;要么部署在同一个集群,但可能导致资源分配不均,甚至有误操作影响其它用户的可
能。而StreamSQL抽离出运行时隔离概念,能保证用户启动、查看和停止流处理应用的操作只能针对当前
所在隔离层进行。
• StreamSQL与ANSI SQL 2003无缝兼容
比如,用户可以使用 CREATE STREAM 创建流;使用 DESCRIBE STREAM 获取流的信息;使用
ALTER STREAM 修改已经定义的流;使用 DROP STREAM 删除流;使用 SHOW STREAMS 查看已
经创建的流。
1. Inceptor StreamSQL简介 | 3
2. 快速入门
在开始正式介绍StreamSQL之前,我们先演示一个简单的StreamSQL例子。在这个例子中,我们将使用Kafka
的console工具生成一些简单的数据,并让StreamSQL来处理。这个演示包含三个部分:
1. 建一个Kafka数据源;
2. 在Inceptor中建一个Stream并触发StreamJob;
3. 在Inceptor中处理Stream从Kafka数据源接收的数据。
2.1. 建Kafka数据源
1. 登陆您集群中的一台安装了Kafka的节点。进入/usr/lib/kafka/bin目录,该目录下有建Kafka数据源的
所需要的一些脚本。
2. 建一个Kafka Topic
执行下面指令,运行/usr/lib/kafka/bin目录下的kafka-create-topic.sh脚本:
./kafka-create-topic.sh --partition 3 --topic demo --zookeeper 172.16.1.128:2181 --broker
172.16.1.127:9092
creation succeeded!
该topic名称为demo,使用172.16.1.128上的Zookeeper,分3个partition。注意,如果您的Kafka处在安
全模式下,你需要另外提供创建topic用户的principal和keytab,并且该用户需要有创建topic的权限。详
细请参考kafka权限管理.pdf。
3. 查看Kafka Topic
执行下面指令,运行/usr/lib/kafka/bin目录下的kafka-list-topic.sh脚本:
./kafka-list-topic.sh --zookeeper 172.16.1.128:2181
topic: demo partition: 0 leader: 5 replicas: 5 isr: 5
topic: demo partition: 1 leader: 6 replicas: 6 isr: 6
topic: demo partition: 2 leader: 4 replicas: 4 isr: 4
我们可以看到刚才建的名为demo的topic和一些相关信息,这些信息的意义会在之后的介绍中解释。
4. 建Kafka producer并发布消息
执行下面指令,运行/usr/lib/kafka/bin目录下的kafka-console-producer.sh脚本:
./kafka-console-producer.sh --broker-list 172.16.1.128:9092 --topic demo
这里我们指定了使用172.16.1.128节点为Kafka broker(详细介绍见后文),并且指定了producer发布
消息的topic为demo。现在,我们可以在命令行中输入一些消息,这些消息都将被发布给demo:
hello
world
5. 到此,我们已经建好了一个Kafka数据源,并发布了一些消息。先不要停止上面producer的进程,让它保
4 | 2. 快速入门