我目前正在开发一个Dataflow管道,它使用Apache Beam Java SDK 2.8.0从Pub / Sub读取流数据。该管道只是Google的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到本地的管道输出也无济于事。
以下是重现问题的全部内容:
git clone https://github.com/GoogleCloudPlatform/DataflowTemplates
<scope>test</scope>
行,使其在运行时支持DirectRunner。--outputShardTemplate=W-P-SS-of-NN
,这是一个省略的选项,在本地运行时需要。--project
,--stagingLocation
和tempLocation
行,因为它不会部署到云端。windowDuration=30s
我怀疑这是一个Pub / Sub相关问题,但是当我运行tcpdump时,它开始连接到Pub / Sub并立即提取数据。它可能是特定于DirectRunner的问题。
虽然我不知道为什么会这样,但我找到了解决这个问题的方法。虽然DataflowRunner
不要求你设置触发器以使其按预期工作,但你必须为DirectRunner
指定一个显式触发器。
将.trrigering
附加到Window.into,问题就消失了。