Flink 数据处理模型
Flink 算子 Operator
Flink 数据处理模型
在 Flink 应用程序中,无论你的应用程序是批程序,还是流程序,都是下图这种模型,有数据源(source),有数据下游(sink)
Source: 数据源
- 基于本地集合、基于文件、基于网络套接字
- 自定义的 source
- Apache kafka、RabbitMQ
Transformation: 数据转换
- Map / FlatMap / Filter / KeyBy / Reduce / Fold / Aggregations / Window / WindowAll / Union / Window join / Split / Select / Project
Sink: 接收器
- 写入文件、打印出来、写入 Socket 、自定义的 Sink
- 自定义的 Sink
- Apache kafka、RabbitMQ、MySQL、ElasticSearch、Apache Cassandra、HDFS
Flink 算子 Operator
Map
获取一个元素并生成一个元素
FlatMap
获取一个元素并生成零个、一个或多个元素
filter
KeyBy
KeyBy 在逻辑上是基于 key 对流进行分区,相同的 Key 会被分到一个分区
Aggregations
DataStream API 支持各种聚合, 这些函数可以应用于 KeyedStream 以获得 Aggregations 聚合
常用的方法有
- min、minBy、max、minBy、sum
- max 和 maxBy 之间的区别在于 max 返回流中的最大值,但 maxBy 返回具有最大值的键, min 和 minBy 同理
Window
Window 函数允许按时间或其他条件对现有 KeyedStream 进行分组
10 秒的时间窗口的和(聚合)
1 | socketStream.keyBy(0).window(Time.seconds(10)).sum(1) |
Union
Union 函数将两个或多个数据流结合在一起, 这样后面在使用的时候就只需使用一个数据流就行了
1 | inputStream.union(inputStream1, inputStream2, ...) |
1 | val socketStream = env.socketTextStream("localhost", 9000, '\n') |
Window Join
通过一些 key 将同一个 window 的两个数据流 join 起来
1 | stream.join(otherStream) |
1 | inputStream.join(inputStream1) |
Split
根据条件将流拆分为两个或多个流
Select
从拆分流中选择特定流,那么就得搭配使用 Select 算子
通常搭配Split算子一起使用