如何使用 Dataflow 在 GCS 上自动编辑超过 100k 的文件?

How to automatically edit over 100k files on GCS using Dataflow?

我在 Google 云存储上有超过 10 万个文件,其中包含 JSON 个对象,我想创建一个镜像来维护文件系统结构,但有一些字段从文件内容中删除。

我尝试在 Google Cloud Dataflow 上使用 Apache Beam,但它会拆分所有文件,我无法再维护结构。我正在使用 TextIO.

我的结构类似于reports/YYYY/MM/DD/<filename> 但 Dataflow 输出到 output_dir/records-*-of-*.

如何让Dataflow不拆分文件并以相同的目录和文件结构输出?

或者,是否有更好的系统可以对大量文件进行这种编辑?

您不能为此直接使用 TextIO,但 Beam 2.2.0 将包含一项功能,可帮助您自己编写此管道。

如果您可以在 HEAD 处构建 Beam 的快照,那么您已经可以使用此功能了。 注意:API 在撰写此答案和 Beam 2.2.0 发布之间可能会略有变化

  • 使用 Match.filepatterns() 创建 PCollection<Metadata> 个匹配文件模式
  • 的文件
  • PCollection<Metadata> 映射到 ParDo,使用 FileSystems 对每个文件执行您想要的操作:
    • 使用 FileSystems.open() API 读取输入文件,然后使用标准 Java 实用程序来处理 ReadableByteChannel
    • 使用FileSystems.create()API写入输出文件。

请注意,Match 是一个非常简单的 PTransform(在后台使用 FileSystems),您可以在项目中使用它的另一种方法是复制粘贴(将其代码的必要部分)添加到您的项目中,或研究其代码并重新实现类似的东西。如果您对更新 Beam SDK 版本犹豫不决,这可能是一个选项。