时间窗口到接收器管道之间的操作顺序

hrysbysz  于 2021-06-24  发布在  Flink
关注(0)|答案(1)|浏览(296)

假设我有一个flink管道: kafka_source -> maps/filters/keyBy/timewindow(1 minute) -> sinkCassandra 当分组消息到达 sinkCassandra 操作,我保证没有其他插槽也不会同时运行 maps/filters/keyBy/timewindow(1 minute) 管道的一部分?
或者,在另一组正在运行sinkcassandra操作时,是否有可能让其他插槽在中间管道上运行?
编辑(根据评论对话添加了更多要求):
我要做的是根据数据存储中的flink数据键进行有效的查找,并进行更新并将更新后的数据刷新回来。
我逃避使用 kafka_source -> maps/filters -> keyBy/TimeWindow/statefulReduce -> sinkCassandra 是因为状态可能会变得很大(1天到7天,我可以将7天作为最大时间边界),而且我不一定知道每个键的时间窗口。这将意味着一个巨大的国家,即使有rocksdb。
我正在考虑的另一个可能的选择是 kafka_source -> maps/filters -> keyBy/sinkCass 在自定义接收器操作中,如果我有要更新的密钥,我会首先签入某种内存缓冲区。如果没有,我就去Cassandra那里取。每5秒(或每n秒),我会抓住缓冲区中的任何东西,冲入Cassandra。为了限制内存,我可以做一个内存中最近最少使用的hashmap(我不一定要刷新b/c多个键会再次出现!)

z6psavjg

z6psavjg1#

除非您显式地配置了一些不寻常的东西,否则每个插槽都将包含完整管道的一个平行切片——每个插槽都将有一个kafka源示例连接到kafka分区的不相交子集,以及maps/filters/keyby/window和cassandra sink。
所有这些并行子管道(插槽)将同时运行。此外,在每个插槽中,每个操作符也将同时运行。接收器和管道的中间部分已经同时运行,但是它们正在争夺包含它们的插槽的资源。如果担心饥饿,可以将任务管理器配置为每个插槽有更多的内核。
编辑(响应有关需求的添加信息):
您可以安全地假设,对于任何给定的flink数据键,在keyby之后,每个操作符只有一个示例将处理该键的事件。这个原则是Flink设计的基础。如果我能正确理解你在想什么,那是你唯一需要的保证。

相关问题