Google Cloud Dataflow + Java 8 vs Java 11:相同的管道,不同的 CPU 工人利用率

Google Cloud Dataflow + Java 8 vs Java 11: same pipeline, different CPU utilization on workers

我有一个 Beam 2.25.0 管道,它获取一些数据,生成更多数据(执行扇出),重新分区新数据,以及 运行 并行计算生成的数据。我为这项工作指定的机器是 n1-highmem-4,我指定最多 40 个工人。

在 Java 8 下工作正常:提供给该工作的所有工人都得到充分利用 (>90% CPU)。吞吐量为 40 elements/s.

当我重新编译并重新运行 管道使用 Java 11 时,为作业提供了相同数量的工人,但它们仅达到 30% CPU 利用率,并且吞吐量较小,低于 18/s。

为了让作业达到相同的吞吐量数字,我必须指定 --numberOfWorkerHarnessThreads=4 标志,即使那样,吞吐量仍然不像我 [=47= 时那样是 40/s ] Java 8.

下的管道

管道使用 Java 8 与 Java 11 之间有什么区别?为什么在 Java 11 下的管道 运行ning 不能像在 Java 8 下那样自动利用工人?

我还尝试重新编译并使用 Beam 2.26.0 执行 Java 11 管道,但它具有相同的吞吐量。

Beam 中有一个 bug 使管道默认只使用 1 个线束线程用于 Java 11。指定 numberOfWorkerHarnessThreads=4 使管道使用 4 个线束将使它使用 4 个线程。

您可以看到工作人员确实使用了大约 25% Cpu,这(因为您使用的是 4 核机器 n1-highmem-4,因为从 post) 看,意味着 100%/4 个核心 = 25%。

看Jira,应该是2.26.0就修复了,可能是延迟到2.27.0