Dataflow 服务的动态工作负载再平衡功能可让该服务根据运行时状况动态地重新分配工作负载。这些状况可能包括:
- 工作负载分配不平衡
- 工作器完成时间超出预期
- 工作器完成速度超出预期
Dataflow 服务会自动检测这些状况,并可动态地将工作分配给未使用或未充分利用的工作器,从而缩短作业的总体处理时间。
限制
动态工作负载再平衡功能仅适用于 Dataflow 服务并行处理部分输入数据的情况,例如,从外部输入源读取数据、使用具体化的中间 PCollection
,或使用 GroupByKey
等汇总的结果。如果您的作业中有大量步骤发生了融合,则该作业的中间 PCollection
将会较少,而动态工作负载再平衡功能将会仅限于来源具体化 PCollection
中的元素数。如果您希望确保动态工作负载再平衡功能可应用于流水线中的特定 PCollection
,则可以通过几种不同方式阻止融合,以确保能进行动态并行处理。
动态工作负载再平衡功能无法重新并行处理比单条记录更精细的数据。 如果数据中所含的个别记录会导致处理时间大幅延迟,那么这些记录可能仍会导致作业延迟。Dataflow 无法对个别“热门”记录进行细分并将其重新分配到多个工作器。
Java
如果您为流水线的最终输出设置了固定数量的分片(例如使用 TextIO.Write.withNumShards
写入数据),则 Dataflow 会根据您选择的分片数量来限制并行处理。
Python
如果您为流水线的最终输出设置了固定数量的分片(例如使用 beam.io.WriteToText(..., num_shards=...)
写入数据),则 Dataflow 会根据您选择的分片数量来限制并行处理。
Go
如果您为流水线的最终输出设置了固定数量的分片,则 Dataflow 会根据您选择的分片数量来限制并行处理。
使用自定义数据源
Java
如果流水线使用您提供的自定义数据源,您必须实现 splitAtFraction
方法,以使来源能够使用动态工作负载再平衡功能。
如果 splitAtFraction
的实现方式不正确,则来源中的记录可能会重复或被丢弃。如需了解有关实现 splitAtFraction
的帮助和提示,请参阅 RangeTracker 上的 API 参考信息。
Python
如果流水线使用您提供的自定义数据源,则 RangeTracker
必须实现 try_claim
、try_split
、position_at_fraction
和 fraction_consumed
,以使来源能够使用动态工作负载再平衡功能。
如需了解详情,请参阅 RangeTracker 上的 API 参考信息。
Go
如果流水线使用您提供的自定义数据源,则您必须实现有效的 RTracker
,以使来源能够使用动态工作负载再平衡功能。
如需了解详情,请参阅 RTracker API 参考信息。
动态工作负载再平衡功能使用自定义来源 getProgress()
方法的返回值来激活。getProgress()
的默认实现返回的是 null
。为了确保自动扩缩功能可以激活,请务必使自定义来源重写 getProgress()
并返回适当的值。