[英]Is there any way to do processing after GCP dataflow has completed the job using apache beam?
[英]Running function once Dataflow Batch-Job step has completed
我有一個數據流作業,它有一個扇出步驟,每個步驟都將結果寫入 GCS 上的不同文件夾。 在批處理作業執行期間,每個文件夾都會寫入數百個文件。
我想確定 FileIO 步驟何時完成,以便運行將文件夾的全部內容加載到 BigQuery 表的 java 代碼。
我知道我可以使用 Cloud Functions 和 PubSub 通知為每個寫入文件執行此操作,但我更喜歡僅在整個文件夾完成時執行一次。
謝謝!
有兩種方法可以做到這一點:
運行您的管道並在您的管道結果上調用waitUntilFinish
(Python 中的wait_until_finish
)以延遲執行,直到您的管道完成后,如下所示:
pipeline.run().waitUntilFinish();
您可以根據waitUntilFinish
的結果驗證管道是否成功完成,然后您可以將文件夾的內容加載到 BigQuery。 這種方法的唯一警告是您的代碼不是 Dataflow 管道的一部分,因此如果您依賴管道中的元素來執行該步驟,它將更加困難。
FileIO.Write 轉換的結果是WriteFilesResult ,它允許您通過調用 getPerDestinationOutputFilenames 來獲取包含寫入文件的所有文件名的getPerDestinationOutputFilenames
。 從那里,您可以使用可以將所有這些文件寫入 BigQuery 的轉換繼續您的管道。 這是 Java 中的一個示例:
WriteFilesResult<DestinationT> result = files.apply(FileIO.write()...)
result.getPerDestinationOutputFilenames().apply(...)
Python 中的等效項似乎稱為FileResult
但我找不到該文件的好文檔。
@Daniel Oliveira 建議了一種您可以遵循的方法,但我認為這不是最好的方法。
我請求與他不同的兩個原因:
- 用於處理作業失敗的窄 scope:考慮您的 Dataflow 作業成功但加載到 Big Query 作業失敗的情況。 由於這種緊密耦合,您將無法重新運行第二個作業。
- 第二個工作的性能將成為瓶頸:在文件大小會增長的生產場景中,您的加載工作將成為其他依賴進程的瓶頸
正如您已經提到的,您不能在同一份工作中直接寫信給 BQ。 我會建議你以下方法:
- 創建另一個梁作業以將所有文件加載到 BQ。 你可以參考這個來閱讀beam中的多個文件。
- 使用Dataflow Java Operator或Dataflow Template Operator使用 Cloud Composer 編排代碼。 將 airflow 觸發規則設置為'all_sucess'並設置 job1.setUpstream(job2)。 請參閱此處的 airflow 文檔
我希望這有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.