我正在使用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
创建一个事件时间计时器就足够了。