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

Apache Flink:每个分区的水印?

傅志诚
2023-03-14

我看到关于为每个密钥添加水印支持的讨论很多。但是flink支持每个分区的水印吗?

当前-然后考虑所有水印(非空闲分区)的最小值。因此,窗口中最后挂起的记录也被卡住了。(使用periodicemit增加水印时)

任何关于这方面的信息都非常感谢!

共有1个答案

云曦之
2023-03-14

一些来源,如FlinkKafkaConsumer,支持逐分区水印。通过在源上而不是在源生成的流上调用assignTimestampsAndWatermarks来实现这一点。

它的作用是每个消费者实例跟踪每个分区内的最大时间戳,并将这些最大值的最小值作为其水印,减去配置的有界异常。如果您将空闲分区配置为这样做,它将被忽略。

这不仅可以产生更精确的水印,而且如果您的事件在每个分区内都是按顺序排列的,这也可以利用水印策略。forMonotonousTimestamps()策略。

有关更多详细信息,请参阅水印策略和Kafka连接器。

至于为什么没有触发最后一个窗口,这与水印有关,但与每分区水印无关。问题很简单,windows是由水印触发的,水印在事件的时间戳之后。因此,水印永远无法赶上最终事件,也永远无法触发最后一个窗口。

这对于无限流作业来说不是问题,因为它们从不停止,也没有最后一个窗口。对于批处理作业来说,这不是问题,因为它们知道所有的数据。但对于有边界的流媒体作业,您需要做一些事情来解决这个问题。广义地说,您必须做的是通知Flink输入流已经结束——每当Flink源检测到它们已经到达基于事件时间的输入流的末尾时,它们就会发出最后一个值为MAX\u水印的水印,这将触发任何打开的窗口。

一种方法是将KafkaDeserializationSchema与isEndOfStream的实现一起使用,该实现在作业结束时返回true。

 类似资料:
  • 找到给定RDD的每个分区大小的最佳方法是什么。我正在尝试调试一个扭曲的分区问题,我尝试了以下方法: 它适用于小型RDD,但对于大型RDD,它会产生OOM错误。我的想法是,导致了这种情况的发生。但不管怎样,我只是想知道有没有更好的方法?

  • 在Apache Spark中, -允许将RDD精确划分为分区。 而是如何将给定的RDD划分成分区,使得所有分区(最后一个分区除外)都具有指定数量的元素。鉴于RDD元素的数量是未知的,做<代码>。count()的开销很大。 预期:

  • 最近我尝试使用ApacheFlink进行快速批处理。我有一个表,它有一个列:value和一个不相关的索引列 基本上我想计算每5行值的平均值和范围。然后我将根据我刚才计算的平均值计算平均值和标准偏差。所以我想最好的方法是使用窗口。 看起来是这样的 但是我不知道用。我试过,但它说没有这样的输入。我只希望它在从源代码读取时按顺序分组。但是它必须是一个时间属性,所以我不能使用索引列作为排序。 我是否必须添

  • 是否有一种方法可以使用datastax/spark-cassandra-connector来选择每个分区密钥的最新版本,该版本相当于Cassandra3.6和更高版本的每个分区限制选项? PerPartitionLimitTest域实体 卡桑德拉表: Maven引用:

  • 整数n的划分是将n写成正整数和的一种方式。对于 例如,对于n=7,一个分区是1 1 5。我需要一个程序来查找所有 使用“r”整数对整数“n”进行分区。例如,

  • 我想计算区域内的分区统计数据,以符合等宽。 得到区段列表后,想法是分配块号,因为栅格::区段函数需要一个带有表示区段代码的栅格层。 当我尝试用分区编号填充范围时,填充的区域与范围不对应(请参见图)。为什么会这样?