google-cloud-dataflow - Google Cloud Dataflow + Java 8 vs Java 11:相同的管道,不同的工作线程 CPU 利用率
问题描述
我有一个 Beam 2.25.0 管道,它获取一些数据,生成更多数据(执行扇出),重新分区新数据,并对生成的数据并行运行计算。我为这项工作指定的机器是 n1-highmem-4,我指定最多 40 个工人。
它在 Java 8 下运行良好:为作业提供的所有工作人员都已充分利用(> 90% CPU)。吞吐量为 40 个元素/秒。
当我重新编译并重新运行管道以使用 Java 11 时,为作业提供了相同数量的工作人员,但它们仅达到 30% 的 CPU 利用率,并且吞吐量更少,低于 18/s。
为了让我的工作达到相同的吞吐量数字,我必须指定--numberOfWorkerHarnessThreads=4
标志,即使那样,吞吐量仍然不是 40/s,就像我在 Java 8 下运行管道时那样。
在管道中使用 Java 8 和 Java 11 有什么区别?为什么在 Java 11 下运行的管道不会像在 Java 8 下一样自动利用工作人员?
我还尝试重新编译并使用 Beam 2.26.0 来执行 Java 11 管道,但它具有相同的吞吐量。
解决方案
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
推荐阅读
- python - 如何从 JPATH 构造 JSON
- javascript - onchange of SELECT 元素我希望下一个 INPUT 元素需要更改。INPUT 元素在数组“quest[]”中命名
- docker - heroku-container-registry 被列入黑名单
- ios - 将块并发插入并发队列
- reactjs - React 中的双重渲染 - 这是一个问题吗?
- javascript - 如何正确安装和设置 PIXI.js?(PIXI 未定义)
- javascript - iframe - 假装它是移动模式
- logging - 带有 logback 的 clj-http 日志记录
- python - Flask:如何摆脱导致 500 错误的 pdfkit
- django - 循环修改Django的ORM查询