Flink keyby/window操作员任务执行地点和内部


0

我是 Flink的新成员。我正在写一个简单的flinkpoc程序,在那里我可以得到预期的输出。但是我不能得到关于按 key和窗口操作的内部信息。下面是我的代码,

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 job时,我在Flink用户界面中看到了下图,

任务可视化工具

从上面的图片我完全理解它使用2个任务和4个槽,每个任务有2个并行性。第一个任务有源,pojo map器第二个任务有求和函数,sink函数。

现在的问题是,

    按 key和窗口操作 where?在第一个任务中或

1 答案


0

因为它们是通过数据转发 join来 join的,所以source和flatmap操作符被 chaining接到同一个任务中,同样的情况也适用于window和sink。但由于 flatMap 和窗口是通过按 key join的,因此需要进行网络 shuffle。

因此,您的 job总共有4个任务:2个source plus flatmap实例,2个window plus sink实例。这4个任务被部署到2个任务槽中,每个槽都有一个源/平面 map任务和一个窗口/ sink任务。

keyBy在图上表示HASH的地方被描述。keyBy不是运算符,而是对keyBy之前和之后的运算符如何 join的描述。

这两行代码

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

一起描述window操作符,它在图中显示为mySumFunction。窗口在第二个任务中。

假设每个不同的 key都有一个窗口,并且这100个窗口中的每一个都包含5个记录,这是正确的。

关于了解Flink的更多信息,我可以推荐ApacheFlink培训、ApacheFlink的流处理,以及在YouTube上搜索Flink Forward talks。


我来回答

写文章

提问题

面试题