Apache Beam / Dataflow 转换建议

问题描述

我有一个批处理数据解析作业,其中输入是一个 zip 文件列表,每个 zip 文件都有许多要解析的小文本文件。以 100Gb 的 50 个 zip 文件压缩的​​顺序,每个 zip 包含 100 万个文本文件

我在 Python 中使用 Apache Beam 的包并通过 Dataflow 运行作业。

我是这样写的

  1. 从 zip 文件路径列表创建集合
  2. FlatMap 具有为 zip 中的每个文本文件生成函数一个输出是从文本文件读取的所有字节的字节字符串)
  3. ParDo 使用一种方法生成文本文件中数据中的每一行/读取的字节
  4. ...做其他事情,比如在某个数据库的相关表中插入每一行

我注意到这太慢了 - cpu 资源只使用了百分之几。我怀疑每个节点都获得了一个 zip 文件,但工作并未在本地 cpu 之间分配 - 因此每个节点只有一个 cpu 在工作。考虑到我使用了 FlatMap,我不明白为什么会这样。

解决方法

Dataflow 运行器使用 Fusion optimisation

'...此类优化可以包括将管道执行图中的多个步骤或转换融合为单个步骤。'

如果您有一个在其 DoFn 中具有大扇出的变换,我怀疑您描述中的 Create 变换确实如此,那么您可能希望通过在您的管道中引入 shuffle 阶段来手动中断融合,如链接文档。