1.1 不同级别的抽象
-
Flink API 最底层的抽象为有状态实时流处理。其抽象实现是 Process Function,并且 Process Function 被 Flink 框架集成到了 DataStream API 中来为我们使用。自由度最高,从而允许程序可以实现复杂计算。
-
Flink API 第二层抽象是 Core APIs。Core APIs 提供的流式 API(Fluent API)为数据处理提供了通用的模块组件,例如各种形式的用户自定义转换(transformations)、联接(joins)、聚合(aggregations)、窗口(windows)和状态(state)操作等。此层 API 中处理的数据类型在每种编程语言中都有其对应的类。
-
Flink API 第三层抽象是 Table API。Table API 是以表(Table)为中心的声明式编程(DSL)API,例如在流式数据场景下,它可以表示一张正在动态改变的表。
表和 DataStream/DataSet 可以进行无缝切换,Flink 允许用户在编写应用程序时将 Table API 与 DataStream/DataSet API 混合使用。 -
Flink API 最顶层抽象是 SQL。这层抽象在语义和程序表达式上都类似于 Table API,但是其程序实现都是 SQL 查询表达式。SQL 抽象与 Table API 抽象之间的关联是非常紧密的,并且 SQL 查询语句可以在 Table API 中定义的表上执行。
1.2 常用DataStream API
flink-demo
1.2.1 Map
DataStream → DataStream
1.2.2 Filter
DataStream → DataStream
1.2.3 Flatmap
DataStream → DataStream
1.2.4 KeyBy
DataStream → KeyedStream
1.2.5 Reduce/Aggregations
KeyedStream → DataStream
1.2.6 union
DataStream* → DataStream
1.2.7 旁路输出
DataStream → DataStream*
1.2.8 window/WindowAll
-
KeyedStream → WindowedStream
-
DataStream → AllWindowedStream
Sliding Windows滑动窗口(time/count):
- 每次滑动window slide的距离, 并获取window size范围内的数据进行处理
Tumbling Windows滚动窗口(time/count): (滚动窗口是window size = widow slide的滑动窗口)
- 每次获取window size范围内的数据进行处理
1.2.8 Window有序消费
-
场景: Window基于 EventTime 统计, 需要既实时统计, 又需要保障数据准确性
-
问题: Window基于 EventTime 而不是 OperateTime 计算时, Flink会丢弃延时数据
Watermark(水印):
-
缺点: 降低吞吐量(缓存历史窗口数据), 仅能处理允许延时范围内的数据, 迟到严重数据依然会被丢弃
-
窗口按 EventTime 计算后, 划分每个窗口开始,结束时间点; 按读取到消息被标记上的Watermark判断是否超过结束时间点触发统计
-
Watermark 标记规则: 例: 窗口结束时间-2秒 -> 允许消息延迟2秒
Allowed Lateness(允许迟到机制):
- 将延迟过于严重的数据输出到侧输出流, 侧输出流存储或进行特殊处理
1.2.9 RichAsyncFunction(外部数据访问的异步 I/O)
实现数据库(或键/值存储)的异步 I/O 交互需要支持异步请求的数据库客户端。许多主流数据库都提供了这样的客户端。
如果没有这样的客户端,可以通过创建多个客户端并使用线程池处理同步调用的方法,将同步客户端转换为有限并发的客户端。
然而,这种方法通常比正规的异步客户端效率低。