当源输入耗尽时,Flink 在进程函数上触发注册定时器

Flink trigger registered timer on process function when source input has been exhausted

我正在使用 Flink 流从多个资源(包括文件)读取输入。我的目标是触发一些 周期性计算(处理时间),并在到达文件末尾时触发最终结果。 我的处理子拓扑如下所示

myGenerator
   .generateData()
   .map(...)
   .keyBy(...)
   .process(new TriggerFunction(timeout));

我的生成器源之一可以是包含有界数据的文件

e.g. env.readFile(inputFormat, filename, FileProcessingMode.PROCESS_ONCE, interval, typeInfo);

所以我想知道是否有一种机制可以捕获源运营商发送的声明结束的事件 已达到输入的数量,预计不会有更多事件表明拓扑结构已拆除。

据我了解,当我的源代码到达输入(文件)末尾时,它标志着处理结束 给下游运营商,因此我没有机会或没有办法触发最终结果 通过在 udf 处理函数中注册的周期性计时器发出。

我试过用 'FileProcessingMode.PROCESS_CONTINUOUSLY' 打开文件源,但这似乎是 更多的是黑客而不是解决方案。我也尝试过使用标点水印的水印策略 但我不确定如何从源中捕获 END_OF_INPUT 并转发适当的水印(例如 Long.MAX_VALUE)。

有没有一种方法可以确保即使源事件已用尽也能触发我的计时器?

对于有界源,Flink 将在所有输入被消耗后自动发送值为 Watermark.MAX_WATERMARK 的水印。因此,为 Long.MAX_VALUE.

创建一个 event-time 计时器就足够了