Flink源函数引入了水印,并将其传递给下游的操作人员,根据这些操作,不同的基于时间的东西可以执行。对于使用多个流的算子,目前认为输入水印上的最小值是算子的水印。
keyBy将源流分解为多个逻辑流,然后传递给下游运算符(例如。过程函数)。
例如:
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)
}
}假设有四个子任务的进程功能(例如。P1, P2, P3, P4),并且有100个密钥组(比方说,KG1, KG2....KG100),每个子任务处理25个关键组,即。P1 processing KG1 to KG25,P2 processing KG26 to KG50等。
如果从下午5点开始DriverStream中没有任何元素,则任何P1,P2,P3,P4都不会在下午5点之后获得水印,因此在下午5点之后不会触发计时器。
比方说,在下午5点,驱动程序流开始获得记录,所有这些记录都映射到一个关键组,即。KG1,因此由进程函数的一个子任务(即。P1)。
KG1元素注册的计时器KG2 to KG25 on P1上注册的计时器是否会被触发,因为它们没有接收到P1.中的任何元素。
发布于 2021-08-11 13:20:30
在P2、P3、P4上执行事件时间进度,因为它们没有收到任何记录。
这取决于源函数是否有空闲实例,以及水印策略是否使用withIdleness()。如果源函数的所有实例都在处理来自KG1的记录,或者使用了withIdleness(),那么水印将在P2、P3和P4上前进。
...在KG2 to KG25 on P1上注册的计时器会被解雇吗?
是的他们有。currentWatermark应用于整个给定的子任务,而不考虑键或密钥组。
https://stackoverflow.com/questions/68739336
复制相似问题