【发布时间】:2017-06-28 12:48:35
【问题描述】:
我们正在使用 Beam 的 Java SDK 2.0.0 在 ParDo 中生成顺序索引。就像 Beam 的 introduction to stateful processing 中的简单状态索引示例一样,我们使用 ValueState<Integer> 单元格,我们对它的唯一操作是检索值并在需要下一个索引时递增:
Integer statefulIndex = firstNonNull(index.read(), 0);
index.write(statefulIndex + 1);
使用 Google 的 Dataflow runner 运行时,我们在 Dataflow 监控界面上注意到 ParDo 的挂墙时间与经过的时间同步累积。我们能够通过 ssh 进入工作节点并使用 top 和 1 查看每个内核的 CPU 使用率来确认 ParDo 执行单线程。注释掉有状态处理单元并保持代码不变,同一个 ParDo 使用我们 n1-standard-32 工作节点的所有核心。
即使 Dataflow 运行器能够基于每个键和窗口对并行化状态索引(我们目前有一个窗口和一个键),但缺乏并行性会导致性能显着下降,以至于我们无法使用它.这是 Dataflow 运行器的预期行为吗?
天真地,我预计 Beam 的状态索引在幕后会像 Java 的 AtomicInteger 那样运行。是否存在阻止使用 ValueState<Integer> 单元进行并行处理的限制,或者此功能尚未内置到运行器中?
【问题讨论】:
标签: google-cloud-dataflow apache-beam