Hazelcast Jet管道中“ withIngestionTimestamps()”的用法到底是什么?

时间:2019-05-08 15:15:14

标签: java hazelcast-jet

我正在运行一个管道,其源来自Kafka主题,并下沉到IMap。每当我写一个时,都会遇到方法withIngestionTimestamps()withoutTimestamps(),想知道它们有什么用?我了解所有有关事件增加时间的来源。问题是如何使用它?我看不到任何从事件中获取时间戳的方法吗?

我的IMap可能充满重复值。是否可以使用withIngestionTimestamps()方法评估最新记录并丢弃旧记录?

2 个答案:

答案 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方法中的注释。