0%

Flink常用的算子

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
2
3
val socketStream = env.socketTextStream("localhost", 9000, '\n')
val textStream = env.readTextFile("/word.txt")
socketStream.union(textStream)

Window Join

通过一些 key 将同一个 window 的两个数据流 join 起来

1
2
3
4
5
stream.join(otherStream)
.where(<KeySelector>)
.equalTo(<KeySelector>)
.window(<WindowAssigner>)
.apply(<JoinFunction>)
1
2
3
4
inputStream.join(inputStream1)
.where(0).equalTo(1)
.window(Time.seconds(5))
.apply (new JoinFunction () {...});

Split

根据条件将流拆分为两个或多个流

Select

从拆分流中选择特定流,那么就得搭配使用 Select 算子

通常搭配Split算子一起使用

写文不易,感谢支持!
Writing is not easy. Thank you for your support.