首页 > 解决方案 > Google Cloud Dataflow + Java 8 vs Java 11:相同的管道,不同的工作线程 CPU 利用率

问题描述

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

它在 Java 8 下运行良好:为作业提供的所有工作人员都已充分利用(> 90% CPU)。吞吐量为 40 个元素/秒。

在 java8 中运行的管道

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

java 11中的管道

为了让我的工作达到相同的吞吐量数字,我必须指定--numberOfWorkerHarnessThreads=4标志,即使那样,吞吐量仍然不是 40/s,就像我在 Java 8 下运行管道时那样。

使用 java 11 的管道并指定每个工作人员的线程

在管道中使用 Java 8 和 Java 11 有什么区别?为什么在 Java 11 下运行的管道不会像在 Java 8 下一样自动利用工作人员?

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

标签: google-cloud-dataflowapache-beam

解决方案


Beam 中存在一个错误,使管道默认为 Java 11 中的 Batch 仅使用 1 个线束线程。指定numberOfWorkerHarnessThreads=4使管道使用 4 个线束将使其使用 4 个线程。

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

看 Jira 应该是在 2.26.0 修复的,但可能是延迟到 2.27.0


推荐阅读