Apache Beam-在管道中添加延迟

时间:2020-03-27 16:16:38

标签: apache-beam apache-beam-io apache-beam-pipeline

我有一个简单的管道,该管道从Pub Sub主题读取并写入BigQuery。我想在从主题中读取消息并将其写入BQ之间引入5分钟的延迟。

我以为我可以使用触发器来做到这一点,类似于下面的内容,但是消息仍然没有延迟地直接通过。

PCollection windowed_inputEvents = inputEvents.apply( Window.into(FixedWindows.of(Duration.standardMinutes(1))。triggering(AfterProcessingTime.pastFirstElementInPane()。plusDelayOf(Duration.standardMinutes(5)))。withAllowedLateness(Duration.standardMinutes(1))。discardingFiredPanes()) ;

是否可以使用触发器创建这样的延迟?

谢谢

1 个答案:

答案 0 :(得分:0)

似乎您正在混淆两件事。在您的示例中,您有一个1分钟的固定窗口,这意味着在该窗口的末尾会发出作为该窗口一部分的所有数据元素。

触发器基本上是附加的杠杆,您可以利用它们在关闭窗口之前发出数据。窗口期关闭后,触发器无法保存数据。例如,如果窗口在12:00到12:01之间,并且第一个元素在12:00到来,则在12:01窗口关闭时,该元素将被发射,直到12:才停止: 05。

要满足您的要求,您可以做几件事:-

  1. 增加窗口周期的大小,使其比 保留期限,然后可以延迟发出数据元素。
  2. 如果在BigqueryIO中无法做到这一点,则可以使用FILE_LOADS方法 您可以利用它批量地将数据写入Bigquery 该API还可以支持一段时间 withTriggeringFrequency。更多详情可在这找到 - https://beam.apache.org/releases/javadoc/2.2.0/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIO.Write.html#withTriggeringFrequency-org.joda.time.Duration-