开发者学堂课程【开源 Flink 极客训练营:Flink SQL _ Table 介绍与实战】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/760/detail/13341
Flink SQL _ Table 介绍与实战
内容介绍:
一、背景
二、SQL & Table API
三、DEMO
四、演练
一、背景
1.Flink强大的抽象能力
不同层次的抽象覆盖各类应用场景
Flink有强大的API抽象能力,Flink提供了三层API
从底向上分别是Process Function、DataStream API、SQL/Table API
最底层Process Function 提供了最细腻度的控制和语义,用户可以灵活控制时间、注册定时器、某个定时时间处理数据,时间可以说事件的时间或系统的时间
DataStream API,Flink 提供分装的基本的函数,如windows的方法等
val stats = stream
.keyBy( "sensor")
.timiewindow ( Time. seconds(5))
.sum((a, b) -> a.add(b))
可以做基本的操作
SQL/Table API层,Flink最高层次的API,通过SQL的语法,表述作业。
每一层都有不同的针对的用户群体,越低层次的灵活度越高,门槛越高,最高层次门槛高,灵活的差。
2.DataStream API很好用
(1)表达力很强的流处理API
Transform, aggregate, and join events- Java and Scala
用户可以使用上面定义好的函数,也可以自己灵活扩展DataStream API不支持的算子的实现,也可以灵活控制事件的监听
(2)时间的控制
Timestamps, Watermarks,Windows,Timers,Triggers,Allowed Lateness,...
指定事件的时间、指定 Watermarks策略,指定大数据的处理等,
十分灵活
(3)维护和更新应用状态
Keyed state, operator state, state backends,checkpointing, ...
3.但却不适用于所有人
(1)写一个分布式程序有时不那么容易
- Stream processing technology spreads rapidly
- New concepts (time, state, ..)
(2)需要一定的知识储备和技巧
- Continous applications have special requirements
- Programming experience (Java / Scala)
(3)用户希望专注于业务逻辑
希望提供一套简单易懂的API
4.Flink SQL/ Table API的优势
(1)易于理解
不同行业不同领域的人都熟悉SQL,学习门槛较低,近几年,SQL称为Hadoop生态圈或大数据处理生态圈标准的语言
(2)声明式
用户只需要表达“我想要什么”,不需要了解如何计算
(3)自动优化
有优化器,为SQL系统生产最优的执行计划,用户能够享受优化带来的性能提升
(4)API稳定
30多年的历史,较为稳定
(5)批流统一
Flink用标准的SQL扩展流处理,用SQL同时做到流处理与批处理,一些场景下,用批处理做全量,流处理做实时更新,用一份数据代码应用在批模式与流模式下,混合模式,用户只需要关心最核心的业务逻辑,维护一个SQL代码,维护一个Flink集群
二、SQL & Table API
1.Apache Flink's Relational APls
两种API,SQL API与Table API
(1)ANSI SQL
SELECT user,COUNT(ur1) AS cnt
FROM clicks
GROUP BY user
遵循ANSI SQL标准设计
(2)LINQ-style Table API
tableEnvironment
.scan("clicks")
.groupBy( ' user)
.select( ' user,'ur1.count as 'cnt)
Table API 类SQL编程式的API
统一的API处理batch & streaming数据
一个查询描述了相同结果
不管它的输入是静态的批数据还是流数据
总结,一份代码,一份结果
2.Flink SQL/Table查询解释
Flink提供了SQL与Table两种API,Table API提供Python语言、scholar语言、Java语言三种,SQL与Table API作业进入Flink后,首先被转化成统一的数据结构的表达形式Logical Plan,在转化过程中,会出现Catalog的事情,Catalog的作用提供一些元数据的信息,如表名、表名信息、涵盖的列以及列的类型、表的统计信息等,信息放入Logical Plan中,用于后续优化。Logical Plan是优化的路口,经过一系列的优化规则后,Flink的优化器会将初始的Logical Plan 优化成优化后的Physical Plan,Physical Plan最终通过Flink的机制将Physical Plan翻译成Transformations 的DNG、DNG图,Transformations是往下一层API,在Transformations有很多优化,Transformations转化成JobGraph,提交到Flink的集群做分布式执行,JobGraph在本地进行生成,JobGraph是用于提交的对象,提交到Flink的集群做分布式执行。
整个流程并没有为流处理或批处理一个特殊的单独的路径做处理,优化、构建的过程都是共享的,优化的规则、二进制的处理算子都是共享的
2.流和批的区别:
(1)假如“Clicks”是一个文件?
点击的文件,文件中有三个字段,user、点击的时间、点击的url
做用户的点击数,根据用户进行分组,用count(url)做点击次数的统计,选出user。在批处理文件的情况下,数据输入完成后,做统一的执行与输出。Mary点击两次,输出2,Bob与Liz点击一次,输出1,特点是输入数据是一次性读入的,输出也是一次性输出的,结果是一个确定性的结果。
SELECT
user,
COUNT(ur1) as cnt
FROM clicks
GROUP BY user
(2)假如“Clicks”是一个流?
数据的格式是相同的,数据是相同的,当进入一条Mary,输出Mary1,当Bob第一次进入,输出Bob1,当Mary第二次进入,查询count状态中之前的值,做增量的计算,Mary对于count状态的值是1,做加1的工作,Liz进入时,输出Liz1,特点是输入的数据是持续不断读入的,输出的数据是不断持续更新的
结果是一样的!
流式结果与批式结果是相同的
SELECT
user,
COUNT(ur1) as cnt
FROM clicks
GROUP BY user
3.Flink SQL/Table应用案例
(1)低延迟ETL处理
做数据的预处理、迁徙等
(2)数据管道,构建低延时实时数仓,实时数据同步
做实时数仓,流批一体的实时数仓;实时数据同步,从一个数据系统同步到另一个数据系统
(3)流式&批式的数据分析
-计算更新实时/离线数据并可视化
如,阿里双十一的大屏,实时消费各种数据流,做各种维度的统计分析
(4)模式识别
实时识别数据流中事件流,做相应的监控、报警服务
-网约车异常事件监测服务
4.Flink SQL/Table核心功能一览(v1.11)
(1)SQL DDL
通过语法注册一张表,DDL直接对接外部系统,DDL功能强弱直接决定Flink与外部系统的连通性,作为计算引擎,数据存储之间的连通性是十分重要的。
(2)完整的类型系统
Flink的一个亮点,Flink完整的类型系统依照标准的SQL设计的,完整的类型系统对SQL引擎是十分必要的。
(3)高效流式TopN
实时计算排行榜,双十一实时销量店铺。
(4)高效流式去重
流式高效去重,对数据中重复的数据进行过滤,否则得到的数据偏大,以较低的代价过滤重复数据。
(5)维表关联
实时关联My SQL等数据
(6)对接CDC
Flink SQL消费常见的CDC工具产生的数据,将数据解析成Flink认识的一些类型操作的数据,做一些聚合、关联等,同步到另一个数据库。
(7)丰富的内置函数
超过230多个内置函数。
(8)MiniBatch
(9)多种解热点手段
提供多种内置优化与调优的手段,聚合拆封等
(10)完整的批处理支持
功能较为完善
(11)Python Table API
(12)Hive集成
Hive是Hadoop生态圈中不容忽视的力量,Flink完整打通与Hive之间的访问,Flink可以直接存在Hive中已有的数据,可以将Flink表的信息存储到Hive中,供后续的访问;Hive实时数仓的解决方案,支持一些功能与数据结构,改善用户体验,有Hive数仓的用户,达到流批一体Hive数仓的目标;Flink SQL中兼容Hive语法,用户直接将Hive的脚本放入Flink中执行。