簡體   English   中英

數據流批處理作業步驟完成后運行 function

[英]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 之后添加轉換

FileIO.Write 轉換的結果是WriteFilesResult ,它允許您通過調用 getPerDestinationOutputFilenames 來獲取包含寫入文件的所有文件名的getPerDestinationOutputFilenames 從那里,您可以使用可以將所有這些文件寫入 BigQuery 的轉換繼續您的管道。 這是 Java 中的一個示例:

WriteFilesResult<DestinationT> result = files.apply(FileIO.write()...)
result.getPerDestinationOutputFilenames().apply(...)

Python 中的等效項似乎稱為FileResult但我找不到該文件的好文檔。

@Daniel Oliveira 建議了一種您可以遵循的方法,但我認為這不是最好的方法。

我請求與他不同的兩個原因:

  1. 用於處理作業失敗的窄 scope:考慮您的 Dataflow 作業成功但加載到 Big Query 作業失敗的情況。 由於這種緊密耦合,您將無法重新運行第二個作業。
  2. 第二個工作的性能將成為瓶頸:在文件大小會增長的生產場景中,您的加載工作將成為其他依賴進程的瓶頸

正如您已經提到的,您不能在同一份工作中直接寫信給 BQ。 我會建議你以下方法:

  1. 創建另一個梁作業以將所有文件加載到 BQ。 你可以參考這個來閱讀beam中的多個文件。
  2. 使用Dataflow Java OperatorDataflow Template Operator使用 Cloud Composer 編排代碼。 將 airflow 觸發規則設置為'all_sucess'並設置 job1.setUpstream(job2)。 請參閱此處的 airflow 文檔

我希望這有幫助

暫無
暫無

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

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