Flink keyby/window 算子任务执行的地方和内部

Flink keyby/window operator task execution place and internals

我是Flink的新大佬。我正在编写一个简单的 Flink POC 程序,我可以获得预期的输出。但是我无法通过和 window 操作获得有关密钥的内部信息。以下是我的代码,

environment
.addSource(consumer)
.name("MyKafkaSource")
.setParallelism(2)
.flatMap(pojoMapper)
.name("MyPojoMapper")
.setParallelism(2)
.keyBy(new MyKeyExtractor())
.timeWindow(Time.seconds(60))
.apply(new SumFunction())
.name("MySumFunction")
.setParallelism(2)
.print()
.name("S3FileSink")
.setParallelism(2)

在部署 Flink 作业时,我在 Flink 中得到以下图表 UI,

Task Visualizer

从上图我完全理解它使用 2 个任务和 4 个槽,每个任务有 2 个并行度。第一个任务有 source,pojo mapper 第二个任务有 sum 函数,sink 函数。

现在的问题是,

  1. KeyBy 和 Window 操作在哪里?在第一个任务或 第二个任务?为什么它在上图中不可见?有没有 如何形象化?

  2. 假设 1 window(60 秒间隔),我收到 100 个不同的 键,每个键在 1 分钟内接收 5 条记录,那么有多少 window 对象是在内部创建的 1 window 间隔?我假设 创建了 100 个 window 个对象,每个 window 个对象将包含 5 个 记录。我的假设是否正确?如果没有可以 请解释一下内部发生了什么?另外如果可能请 分享任何与此相关的文件。

因为它们是通过数据转发连接连接起来的,所以source和flatmap operators被链接到同一个任务中,同样适用于window和sink。但是由于flatmap和window是通过keyBy连接的,所以这里需要进行一次网络shuffle。

因此你的作业总共有 4 个任务:2 个 source plus flatmap 实例,2 个 windowplus sink 实例。这4个任务部署到2个任务槽,每个槽有一个source/flatmap个任务,一个window/sink个任务。

keyBy 在图中标示 HASH 的位置进行了描述。 keyBy 不是运算符,而是描述 keyBy 前后的运算符是如何连接的。

这两行代码

.timeWindow(Time.seconds(60))
.apply(new SumFunction())

一起描述window运算符,在图中显示为mySumFunction。 window 在第二个任务中。

您假设每个不同的键都有一个 window 是正确的,并且这 100 个 windows 中的每一个都包含 5 条记录。

关于学习更多关于 Flink 的资源,我可以推荐 the Apache Flink Training, Stream Processing with Apache Flink,并在 YouTube 上搜索 Flink Forward talks。