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

keyBy和following运算符的Flink水印

常俊侠
2023-03-14

Flink源函数引入水印,这些水印向下传递给下游操作符,根据这些操作符可以执行不同的基于时间的操作。对于使用多个流的操作员,将传入水印的最小值视为此时操作员的水印。

将源流拆分为多个逻辑流,然后将这些逻辑流传递给下游操作员(例如处理函数)。

Eg.

driversStream.keyBy(driver => driver.Id).process(new ProcessDriversFunction)

class ProcessDriversFunction extends ..... {
   override def processElement(record Driver, ctx Context, out Collector) {
      // Register an event timer to fire after 5 seconds
      ctx.timerService().registerEventTimeTimer(record.timestamp+5)
   }
}

假设Process函数有4个子任务(例如P1, P2, P3, P4),并且有100个关键组(假设KG1, KG2...... KG100),每个子任务处理25个关键组,即P1处理KG1到KG25P2处理KG26到KG50等等。

如果从下午5点开始DriverStream中没有任何元素,则P1、P2、P3、P4中的任何一个都不会在下午5点之后获取水印,因此下午5点之后不会触发计时器。

比方说,在下午5点,驱动程序流开始获取记录,以便所有记录都映射到一个关键组,即KG1,并因此被处理函数的一个子任务处理(即P1)。

  • 事件时间是否在P2、P3、P4上进行,因为他们没有收到任何记录

共有1个答案

丁雅惠
2023-03-14

事件时间是否在P2、P3、P4进行,因为他们没有收到任何记录。

这取决于源函数是否有空闲实例,以及是否将withidless()与水印策略一起使用。如果源函数的所有实例都在处理来自KG1的记录,或者如果使用了withIdleness(),则水印将在P2、P3和P4上前进。

。。。P1上为KG2到KG25注册的计时器是否被解雇?

是的。当前水印应用于整个给定的子任务,而不管键或键组如何。

 类似资料:
  • 有2个指定了时间戳的数据流和定义如下的水印生成器。 当这两个流在一个操作符中连接时,来自streamA或streamB的最小水印作为连接操作符的水印。 组合B运算符的水印是A或B中的最小值。基于C类元素是否标记为延迟。 但是,由于我们没有附加任何分配给的时间戳,这是否意味着运算符中的任何元素都没有被标记为延迟?因此在C上窗口不会有任何延迟记录被删除? 假设我们将分配的时间戳和水印生成器附加到C,如

  • 我似乎混淆了逻辑和物理数据分区。

  • 我正在学习flink,试图理解一些概念。以下是几个问题: 对流的操作与从像这样的儿童获取源代码有什么区别?这两个操作都分割流。 还尝试实现一个非常简单的keyBy操作符来理解它,如下所示: 但我得到的输出令人困惑: 这意味着在子任务3上执行的所有内容。有人能帮忙解释一下原因吗?

  • 我读到了四个Kinesis流的数据。每个流中的数据都是不同的数据类型。读取所有四个流后,我分配时间戳和水印,并聚合来自每个流的数据。四个聚合的结果都是使用相同的泛型对象输出的。我想合并四个流的结果,这样我就可以将合并后的流发送到一个ProcessFunction。这基本上允许我像使用CoProcessFunction一样使用ProcessFunction,但我可以处理来自两个以上流的数据(在本例中

  • 进入Flink作业的数据可能会由于代码中的bug或缺乏验证而触发异常。我的目标是提供一致的异常处理方式,我们的团队可以在Flink作业中使用,不会导致任何生产停机。 > 重新启动策略在这里似乎不适用,因为: null null 示例代码: 我想有能力跳过在“keyby”和类似的方法中导致问题的处理,这些方法应该返回一个结果。