我们正在为Apache Beam管道构建集成测试,并且遇到了一些问题。请参阅下文了解背景信息......
有关我们管道的详细信息:
PubsubIO
作为我们的数据源(无界PCollection
)CombineFn
和非常简单的窗口/触发策略JdbcIO
,使用org.neo4j.jdbc.Driver
写入Neo4j 目前的测试方法:
OurPipeline.main(TestPipeline.convertToArgs(options)
PubsubIO
将从这是一个简单的集成测试,它将验证我们的整个管道是否按预期运行。
我们目前面临的问题是,当我们运行我们的管道时,它会阻塞。我们正在使用DirectRunner
和pipeline.run()
(不 pipeline.run().waitUntilFinish()
),但测试似乎在运行管道后挂起。因为这是一个无界PCollection
(在流模式下运行),管道不会终止,因此不会到达任何代码。
所以,我有几个问题:
1)有没有办法运行管道然后稍后手动停止?
2)有没有办法异步运行管道?理想情况下,它只会启动管道(然后将继续轮询Pub / Sub获取数据),然后转到负责发布到Pub / Sub的代码。
3)这种集成测试方法是否合理,或者是否有更好的方法可能更直接?任何信息/指导将不胜感激。
如果我可以提供任何其他代码/上下文,请告诉我们 - 谢谢!
答案 0 :(得分:9)
您可以通过将DirectRunner
管道选项设置为isBlockOnRun
,使用false
异步运行管道。只要您保留对返回的PipelineResult
可用的引用,对该结果调用cancel()
就应该停止管道。
对于第三个问题,您的设置似乎合理。但是,如果您希望对管道进行较小规模的测试(需要较少的组件),则可以将所有处理逻辑封装在自定义PTransform
中。这个PTransform
应该接受从输入源完全解析的输入,并产生尚未为输出接收器解析的输出。
完成此操作后,您可以使用Create
(通常不会执行触发)或TestStream
(这可能取决于您构建TestStream
的方式){ {1}}生成有限数量的输入数据,将此处理DirectRunner
应用于PTransform
,并在输出PCollection
上使用PAssert
来验证生成的管道你期望的产出。
有关测试的更多信息,Beam网站在Programming Guide和blog post中提供了有关这些测试样式的信息,其中包含使用PCollection
测试管道的信息。