KafkaIO水印没有推进

时间:2018-02-13 20:58:05

标签: google-cloud-dataflow apache-beam

我有以下管道用于测试目的:

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使用处理时间,水印是否应该推进?

1 个答案:

答案 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/的一部分修复