簡體   English   中英

Apache Beam - 使用無界PCollection進行集成測試

[英]Apache Beam - Integration test with unbounded PCollection

我們正在為Apache Beam管道構建集成測試,並且遇到了一些問題。 請參閱下文了解情況......

有關我們管道的詳情:

  • 我們使用PubsubIO作為我們的數據源(無界PCollection
  • 中間變換包括自定義CombineFn和非常簡單的窗口/觸發策略
  • 我們的最終轉換是JdbcIO ,使用org.neo4j.jdbc.Driver寫入Neo4j

目前的測試方法:

  • 在運行測試的計算機上運行Google Cloud的Pub / Sub模擬器
  • 構建內存中的Neo4j數據庫並將其URI傳遞給我們的管道選項
  • 通過調用OurPipeline.main(TestPipeline.convertToArgs(options)運行管道OurPipeline.main(TestPipeline.convertToArgs(options)
  • 使用Google Cloud的Java Pub / Sub客戶端庫將消息發布到測試主題(使用Pub / Sub仿真器), PubsubIO將從中讀取
  • 數據應該流經管道並最終命中我們的內存中的Neo4j實例
  • 在Neo4j中對這些數據的存在做出簡單的斷言

這是一個簡單的集成測試,它將驗證我們的整個管道是否按預期運行。

我們目前面臨的問題是,當我們運行我們的管道時,它會阻塞。 我們正在使用DirectRunnerpipeline.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驗證管道產生你所期望的輸出。

有關測試的更多信息,B​​eam網站在編程指南中提供了有關這些測試樣式的信息,以及有關使用TestStream測試管道的博客文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM