Apache Flink
流计算
本质:让数据产生价值
Flink应用场景
事件驱动型应用
- 定义:
事件驱动型应用是一类具有状态的应用,改应用会根据事件流中的事件触发计算、更新状态或进行外部系统操作。常见于实时计算业务
- 架构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ayBEorID-1641371103457)(…/image/image-20220105093204092.png)]
- 两种架构运用起来的区别:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cgVn6rza-1641371103459)(…/image/image-20220105093400176.png)]
实际的开发中,情况可能更复杂,数据可能迟到,对于这种迟到的数据应该怎么办
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NdbUVLIe-1641371103459)(…/image/image-20220105103001944.png)]
- API语法:
SQL:HOP(time_attr,hop_interval,size_interval)
Table:Slide.over(interval(…)).every(interval(…)).on(…).as(…)
示例-窗口大小1小时,滑动步长15分钟:
HOP(ts,INTERVAL ‘15’ MINUTE,INTERVAL ‘1’ HOUR)
- Flink为什么需要窗口
我们知道流式数据集是没有边界的,数据会源源不断的发送到我们的系统中。
流式计算最终的目的是去统计数据产生汇总结果的,而在无界数据集上,如果做一个全局的窗口统计,是不现实的。
只有去划定一定大小的窗口范围去做计算,才能最终汇总到下游的系统中,用来分析和展示。
- 经典的数据传输过程:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4kL3HWGF-1641371103460)(…/image/image-20220105105830434.png)]
中间OPs就是具体的业务逻辑,WATERMARK FOR ts AS ts -INTERVAL '5' SECOND
--数据迟到5s依然不会影响结果的准确性
- Flink机制保障
事件驱动型应用是一类具有状态的应用,该应用会根据事件流中的事件触发计算、更新状态或进行外部系统操作
数据分析型应用
疫情防控分析
近14天新增报告本地感染确诊病例100例以上;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HGxEuBRw-1641371103461)(…/image/image-20220105143020527.png)]
近14天,疫情的防控需要的是实时性,一天出一个结果显然是不够现实的,可能需要每一条数据都要追溯14天的结果
然而HOP Window是不支持这种场景的
需要用到Over Window 传统数据库的开窗函数
OVER Window 目前支持有如下三个元素组合的8种数据类型:
- 时间 Processing Time、EventTime
- 数据集 Bounded 和 UnBounded
- 划分方式 ROWS 和 RANGE
语法
SELECT
agg1(col1) OVER(
[PARTITION BY(value_expression1,…,value_expressionN)]
ORDER BY timeCol
RANGE BETWEEN(UNBOUNDED | timeinterval)PRECEDING AND CURRENT ROW) AS colName,…)
FROM TAB1
示例
SELECT
SUM(count) OVER(
PARTITION By city
ORDER BY ts
RANGE BETWEEN INTERVAL ‘14’ DAY PRECEDING AND CURRENT ROW)
FROM T1