我有以下管道用于测试目的:
pipeline.apply(
"ReadFromKafka",
KafkaIO
.read()
.withBootstrapServers("kafkabroker")
.withoutMetadata()
).apply(
"OutputCount"
Window
.into(FixedWindows.of(Duration.standardMinutes(1)))
.triggering(AfterWatermark.pastEndOfWindow())
.discardingFiredPanes()
.withAllowedLateness(Duration.ZERO)
).apply(
"AccumlateCount",
Combine.globally(Count.combineFn()).withoutDefaults()
).apply(
"PrintCount",
MapElements.via(
new SimpleFunction() {
override def apply(count: Long): Void = {
LoggerFactory.getLogger("CountLogger").info(count.toString)
null
}
}
)
)
当我在数据流上运行时,我注意到在Dataflow pipline UI中,"数据水印"度量标准"步骤摘要"总是" - "。我每30秒向Kafka制作一次约5分钟的活动。它永远不会将计数打印到1分钟窗口的记录器。由于KafkaIO使用处理时间,水印是否应该推进?
答案 0 :(得分:1)
默认水印在KafkaIO的工作方式目前非常糟糕。它不能正确处理空闲分区。它只返回最后一条记录的处理时间。由于您主题中的某些分区似乎没有任何记录,因此您的水印根本没有进展。沉闷的水印应该只返回当前时间。我正在提交PR以正确支持Kafka服务器端时间戳,作为其中一部分,我将修复默认水印。现在请尝试这个工作:
[...]
KafkaIO
.read()
.withBootstrapServers("kafkabroker")
.withWatermarkFn(kv -> Instant.now()) // <<< what KafkaIO should do.
.withoutMetadata()
[...]
<强> [更新] 强> 不幸的是,这不是一个完整的工作。 KafkaIO读者仍然会返回MIN_TIMESTAMP,直到它读取第一条记录,即使上述方法也是如此。如果要在Dataflow中对其进行测试,请尝试使用仅包含单个分区的主题。这不是一个理想的解决方案,但本周将在主人中修复(将是下个月安排的2.4版本的一部分。)。
[更新:2] :将作为https://github.com/apache/beam/pull/4680/的一部分修复