![](/img/trans.png)
[英]Apache Beam Wait.on JdbcIO.write with unbounded PCollection issue
[英]Apache Beam - Integration test with unbounded PCollection
我們正在為Apache Beam管道構建集成測試,並且遇到了一些問題。 請參閱下文了解情況......
有關我們管道的詳情:
PubsubIO
作為我們的數據源(無界PCollection
) CombineFn
和非常簡單的窗口/觸發策略 JdbcIO
,使用org.neo4j.jdbc.Driver
寫入Neo4j 目前的測試方法:
OurPipeline.main(TestPipeline.convertToArgs(options)
運行管道OurPipeline.main(TestPipeline.convertToArgs(options)
PubsubIO
將從中讀取 這是一個簡單的集成測試,它將驗證我們的整個管道是否按預期運行。
我們目前面臨的問題是,當我們運行我們的管道時,它會阻塞。 我們正在使用DirectRunner
和pipeline.run()
( 而不是 pipeline.run().waitUntilFinish()
),但測試似乎在運行管道后掛起。 因為這是一個無限制的PCollection
(以流模式運行),所以管道不會終止,因此不會到達任何代碼。
所以,我有幾個問題:
1)有沒有辦法運行管道然后稍后手動停止?
2)有沒有辦法異步運行管道? 理想情況下,它會啟動管道(然后將繼續輪詢Pub / Sub以獲取數據),然后轉到負責發布到Pub / Sub的代碼。
3)這種集成測試方法是否合理,或者是否有更好的方法可能更直接? 這里的任何信息/指導將不勝感激。
如果我能提供任何額外的代碼/背景,請告訴我 - 謝謝!
您可以通過將isBlockOnRun
管道選項設置為false
來使用DirectRunner
異步運行管道。 只要保留對可用返回的PipelineResult
的引用,對該結果調用cancel()
就應該停止管道。
對於第三個問題,您的設置似乎合理。 但是,如果您希望對管道進行較小規模的測試(需要較少的組件),則可以將所有處理邏輯封裝在自定義PTransform
。 此PTransform
應采用已從輸入源完全解析的輸入,並生成尚未為輸出接收器解析的輸出。
完成后,您可以使用Create
(通常不會執行觸發)或TestStream
(可能,取決於您構建TestStream
)與DirectRunner
生成有限數量的輸入數據,將此處理PTransform
應用於此PCollection
,並使用PAssert
在輸出PCollection
驗證管道產生你所期望的輸出。
有關測試的更多信息,Beam網站在編程指南中提供了有關這些測試樣式的信息,以及有關使用TestStream
測試管道的博客文章 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.