如果不清楚,您应该注意事件时间和处理时间之间的差异:
事件时间- 在源处生成事件的时间
处理时间- 处理引擎内事件执行的时间
src:Flink 文档
AFAIK Storm 不支持事件时间,Spark 的支持有限。这让 Kafka Streams 和 Flink 有待考虑。
Flink 使用 long 类型作为时间戳。文档中提到该值是自 1970-01-01T00:00:00Z 以来的毫秒数,但是 AFAIK,当您使用事件时间特征时,唯一的进度度量是事件时间戳。因此,如果您可以将您的价值观纳入长期范围,那么它应该是可行的。
编辑:
通常,水印(基于时间戳)用于测量窗口、触发器等中事件时间的进度。因此,如果您使用:
AssignerWithPeriodicWatermarks然后在处理时域的配置(自动水印间隔)中定义的间隔中发出新的水印 - 即使使用事件时间特征也是如此。有关详细信息,请参见org.apache.flink.streaming.runtime.operators.TimestampsAndPeriodicWatermarksOperator#open()
方法,其中注册了处理时间中的计时器。因此,如果自动水印设置为 500 毫秒,则每 500 毫秒的处理时间(取自System.currentTimeMillis()
)发出一个新水印,但水印的时间戳基于事件的时间戳。
AssignerWithPunctuatedWatermarks那么最好的描述可以在文档中找到org.apache.flink.streaming.api.datastream.DataStream#assignTimestampsAndWatermarks(org.apache.flink.streaming.api.functions.AssignerWithPunctuatedWatermarks<T>)
:
为数据流中的元素分配时间戳,并根据元素本身创建水印以指示事件时间进度。
此方法纯粹基于流元素创建水印。对于通过 处理的每个元素,如果返回的水印值非负且大于前一个水印,则调用AssignerWithPunctuatedWatermarks#extractTimestamp(Object, long)
该方法并发出新的水印。AssignerWithPunctuatedWatermarks#checkAndGetNextWatermark(Object, long)
当数据流中嵌入了水印元素,或者某些元素带有可以用来确定当前事件时间水印的标记时,这种方法很有用。此操作使程序员可以完全控制水印的生成。用户应该意识到过于激进的水印生成(即每秒生成数百个水印)可能会降低一些性能。
要了解水印的工作原理,强烈推荐阅读:Tyler Akidau on Streaming 102