Apache Beam/Dataflow 重新洗牌

Apache Beam/Dataflow Reshuffle

org.apache.beam.sdk.transforms.Reshuffle的目的是什么?在文档中,目的定义为:

A PTransform that returns a PCollection equivalent to its input but operationally provides some of the side effects of a GroupByKey, in particular preventing fusion of the surrounding transforms, checkpointing and deduplication by id.

防止周围变换融合的好处是什么?我认为融合是一种优化,可以防止不必要的步骤。实际用例会有所帮助。

在某些情况下,您可能想要重新排列数据。以下并非详尽无遗的清单,但应该让您了解为什么要重新洗牌:

当您的一个 ParDo 变换具有非常高的扇出时

这意味着在你的 ParDo 之后并行度增加了。如果你不在这里打破融合,你的管道将无法将数据拆分到多台机器上进行处理。

考虑 DoFn 的极端情况,它为每个输入元素生成一百万个输出元素。考虑这个 ParDo 在其输入中接收 10 个元素。如果你不打破这个高扇出 ParDo 和它的下游转换之间的融合,它将只能 运行 在 10 台机器上,尽管你将有数百万个元素。

  • 诊断此问题的一个好方法 是查看输入 PCollection 中的元素数量与输出 PCollection 的元素数量。如果后者明显大于第一个,那么你可能要考虑加入重新洗牌。

当您的数据在机器之间没有很好地平衡时**

假设您的管道消耗 9 个 10MB 的文件和一个 10GB 的文件。如果每个文件都由一台机器读取,那么您将拥有一台机器比其他机器拥有更多数据。

如果您不重新整理这些数据,您的大部分机器将在您的管道 运行 期间处于空闲状态。重新洗牌允许您重新平衡要在机器之间更均匀地处理的数据。

  • 诊断此问题的一个好方法 是查看有多少工作人员在您的管道中执行工作。如果管道很慢,并且只有一个工作人员处理数据,那么您可以从重新洗牌中受益。