我正在运行一个管道,其源来自Kafka
主题,并下沉到IMap
。每当我写一个时,都会遇到方法withIngestionTimestamps()
和withoutTimestamps()
,想知道它们有什么用?我了解所有有关事件增加时间的来源。问题是如何使用它?我看不到任何从事件中获取时间戳的方法吗?
我的IMap可能充满重复值。是否可以使用withIngestionTimestamps()方法评估最新记录并丢弃旧记录?
答案 0 :(得分:1)
Jet使用事件时间戳记正确应用窗口。它必须决定哪个事件属于哪个窗口,以及何时关闭窗口并发出其汇总结果。时间戳记以元数据的形式显示在事件上,并且不会向用户显示。
但是,如果您要应用引用壁钟时间的逻辑,则始终可以调用System.currentTimeMillis()
来对照IMap值中明确存储的时间戳进行检查。这相当于使用处理时间,这与Jet应用的摄取时间非常相似。摄取时间只是在管道的源顶点有效的处理时间,因此在宿顶点应用处理时间与之略有不同,并且具有相同的实用属性。
答案 1 :(得分:1)
Jet在后台管理事件时间戳,它仅对处理器可见。例如,窗口聚合将使用时间戳。
如果要在代码中查看时间戳,则必须将其包括在项目类型中。您必须从源头开始就没有时间戳记,使用map
运算符添加提取时间戳记,并让Jet知道:
Pipeline p = Pipeline.create();
p.drawFrom(KafkaSources.kafka(...))
.withoutTimestamps()
.map(t -> tuple2(System.currentTimeMillis(), t))
.addTimestamps(Tuple2::f0, 2000)
.drainTo(Sinks.logger());
我用了2000ms的allowedLag
。这样做的原因是,时间戳将添加到分配了时间戳的顶点的下游顶点中。流合并可以在那里发生,并且需要考虑内部偏斜。例如,它应考虑预期的最长GC暂停或网络延迟。请参见addTimestamps
方法中的注释。