当源输入耗尽时,Flink 在处理函数上触发注册计时器

问题描述 投票:0回答:2

我正在使用 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)。

有没有办法确保即使源事件已耗尽也能触发我的计时器?

apache-flink flink-streaming
2个回答
1
投票

对于有界源,Flink 将在所有输入被消耗后自动发送一个值为

Watermark.MAX_WATERMARK
的水印。因此,为
Long.MAX_VALUE
创建一个事件时间计时器就足够了。


0
投票

在 Long.MAX_VALUE 处注册事件时间计时器是有效的。但是,它会导致流元素的时间戳设置为 Long.MAX_VALUE。我们怎样才能防止这种情况发生呢?我们可以在流上重新分配时间戳,但是有更优雅的方法吗?

© www.soinside.com 2019 - 2024. All rights reserved.