繁体   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