当前位置: 首页 > 知识库问答 >
问题:

Flink窗口状态大小和状态管理

凤高翰
2023-03-14

在阅读了Flink的文档并四处搜索后,我无法完全理解Flink的句柄在其窗口中的状态。假设我有一个每小时滚动的窗口,其中包含一个聚合函数,该函数将消息累积到某个java pojo或scala case类中。该窗口的大小将与一小时内进入该窗口的事件数量相关联,还是仅仅与POJO/Case类相关联,因为我将事件累加到该对象中。(例如,如果将10000个味精数成一个整数,大小会接近10000*味精大小还是int大小?)另外,如果im使用POJO或case类,flink是否为我处理状态(如果内存耗尽,则溢出到磁盘/在检查点保存状态等),或者我必须为此使用flink的状态对象?

谢谢你的帮助!

共有1个答案

微生新翰
2023-03-14

窗口的状态大小取决于应用的函数类型。如果应用reducefunctionaggregatefunction,到达的数据将立即聚合,窗口只保存聚合的值。如果应用processWindowfunctionwindowfunction,Flink将收集所有输入记录,并在时间(取决于窗口类型的事件或处理时间)超过窗口结束时间时应用该函数。

您还可以将这两种类型的函数组合在一起,即具有AggregateFunction,后跟ProcessWindowFunction。在这种情况下,到达的记录会立即聚合,当窗口关闭时,聚合结果会作为单个值传递给processWindowfunction。这很有用,因为您可以进行增量聚合(由于reducefunction/aggregatefunction),还可以访问窗口元数据,如开始和结束时间戳(由于processWindowfunction)。

如何管理状态取决于所选择的状态后端。如果配置fsstateBackend,则所有本地状态都保留在TaskManager的堆中,如果状态变得太大,则使用OutofMemoryError杀死JVM进程。如果配置RockSDBStateBackend,则状态会溢出到磁盘。每一次状态访问都需要de/serialization成本,但为状态提供了更多的存储空间。

 类似资料:
  • 我想使用早期触发逻辑进行窗口聚合(您可以认为聚合是由窗口关闭或特定事件触发的),我阅读了文档:https://ci . Apache . org/projects/flink/flink-docs-release-1.12/dev/stream/operators/windows . html # incremental-window-aggregate-with-aggregate functi

  • 我在同一份flink jobs中读了两个Kafka主题。 :来自第一个主题的消息被保存到rocksdb,然后它将与Stream2联合。 :来自第二个主题的消息被Stream1保存的状态所丰富,然后它将与Stream1联合。 主题1和主题2是不同的来源,但两个来源的输出基本相同。我必须用topic1的数据来充实topic2的数据。 这里是流动; 这里是问题; 那个流量好吗? 可以访问由保存的相同的状

  • 这是我的代码。我的问题如下 > 以这种方式清除状态是否正确? 这是使用keyBy的正确方法吗? //有100万个storeId

  • 2)我研究了循环分区的重新平衡。假设我建立了一个集群,如果我的源的并行度为1,如果我进行了重新平衡,我的数据是否会在机器之间进行重排以提高性能?如果是这样,是否有一个特定的端口将数据传送到集群中的其他节点? 3)状态维护有什么限制吗?我计划维护一些用户id相关的数据,这些数据可能会变得很大。我读到flink使用rocks db来维护状态。只是想检查一下是否有限制可以维护多少数据? 4)同样,如果数

  • 在广播模式的文档中,提到没有RocksDB状态后端: 如果应用程序使用rocksdb作为状态后端,这将如何影响保存点行为?这是否意味着状态在保存点期间不存储,因此不会恢复?

  • 我正在编写一个Flink应用程序,它使用kafka主题中的时间序列数据。时间序列数据包含度量名称、标记键值对、时间戳和值等组件。我已经创建了一个滚动窗口来根据度量键(度量名称、键值对和时间戳的组合)聚合数据。这里是主流看起来像 我还想检查是否有任何指标在上面的窗口外迟到。我想检查有多少指标延迟到达,并计算延迟指标与原始指标相比的百分比。我正在考虑使用flink的“允许延迟”功能将延迟指标发送到不同