DirectRunner不会按照我在Beam Java SDK中使用FixedWindows指定的方式读取Pub / Sub

问题描述 投票:0回答:1

我目前正在开发一个Dataflow管道,它使用Apache Beam Java SDK 2.8.0从Pub / Sub读取流数据。该管道只是Google的PubsubToText.java模板。

https://github.com/GoogleCloudPlatform/DataflowTemplates/blob/master/src/main/java/com/google/cloud/teleport/templates/PubsubToText.java

虽然使用DataflowRunner部署到云可以按预期工作,但是使用DirectRunner无法正常运行,即当我在本地环境中工作时,使得开发管道变得非常困难。

例如,当我将FixedWindows速率设置为30秒时,云上的Dataflow Runner每30秒生成一次文件,这是预期的。

但是,当我在本地环境中为DirectRunner设置相同的速率时,它不会每30秒发送一次文件。相反,它以不稳定的方式生成文件。

例如,它在4分钟后发出第一个数据并创建8个本应该创建的文件实际上是一次生成的,接下来是5分钟之后,接着是3分钟之后,......等等,这使得本地开发过程非常耗时且令人沮丧。

我为什么观察这个?

将Java SDK从8切换到11,将Beam SDK从2.8.0切换到2.9.0或2.10.0,从本地切换到GCE实例,从GCS到本地的管道输出也无济于事。

以下是重现问题的全部内容:

  1. git clone https://github.com/GoogleCloudPlatform/DataflowTemplates
  2. 从pom.xml中删除beam-runners-direct-java的<scope>test</scope>行,使其在运行时支持DirectRunner。
  3. 按照https://github.com/GoogleCloudPlatform/DataflowTemplates/blob/master/src/main/java/com/google/cloud/teleport/templates/PubsubToText.java的建议编译和运行程序,但将运行器更改为DirectRunner并添加--outputShardTemplate=W-P-SS-of-NN,这是一个省略的选项,在本地运行时需要。
  4. 同时删除--project--stagingLocationtempLocation行,因为它不会部署到云端。
  5. 发送文件需要很长时间,尽管我设置了windowDuration=30s

我怀疑这是一个Pub / Sub相关问题,但是当我运行tcpdump时,它开始连接到Pub / Sub并立即提取数据。它可能是特定于DirectRunner的问题。

java google-cloud-dataflow apache-beam google-cloud-pubsub
1个回答
0
投票

虽然我不知道为什么会这样,但我找到了解决这个问题的方法。虽然DataflowRunner不要求你设置触发器以使其按预期工作,但你必须为DirectRunner指定一个显式触发器。

.trrigering附加到Window.into,问题就消失了。

© www.soinside.com 2019 - 2024. All rights reserved.