【问题标题】:How does the YARN container use the allocated CPU?YARN 容器如何使用分配的 CPU?
【发布时间】:2022-01-08 16:54:31
【问题描述】:

我很难理解纱线容器是如何受限于分配的资源,尤其是 CPU。

我在 YARN 集群中运行 Spark 或 Flink 作业。每个执行器或任务管理器都请求一个具有 1 个 CPU 的纱线容器。基本上,容器的数量等于主机中可用的 CPU 数量。

我了解 YARN 监控内存使用情况,如果容器超过限制,它会发送终止信号。我想知道 CPU 调度是如何工作的。

我在 YARN 容器 (1CPU) 中的 JVM 作业可以尝试创建多个 CPU 密集型工作线程。 JVM 会被限制为 1 个 CPU 内核来执行这些线程,还是会从其他容器中窃取资源?从技术上讲,一个 YARN 容器会影响其他容器的 CPU 性能吗?

假设我在主机中有 10 个 CPU,我创建了一个容器。容器 CPU 性能是否会是主机 CPU 性能的 10%?

【问题讨论】:

    标签: jvm containers hadoop-yarn


    【解决方案1】:

    默认情况下,yarn 仅通过 RAM 分配资源。所以默认情况下,它希望每个人都玩得很好,并且你会受到 CPU 饥饿工作的影响。你可以改变这个:

    From Apache:

    yarn.scheduler.capacity.resource-calculator 资源计算器 用于比较调度程序中的资源的实现。这 默认,即 仅 org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator 使用内存而 DominantResourceCalculator 使用 Dominant-resource 来 比较Memory、CPU等多维资源。一个Java 应为 ResourceCalculator 类名。

    一般来说,通过内存来估计就足够了。大多数人实际上估计他们对内存和线程的要求非常差。除非遇到问题,否则通常最好忽略 [threads]。如果它仍然是一个问题,那么可以考虑查看 DominantResourceCalculator。如果/当您打开 resourceDominantCalculator 时,请准备好让很多人感受到影响。您可能已经严重过度分配线程,当我们开始计算线程时,他们将突然不得不考虑他们所要求的。 (或者至少这是我的经验。)这可能会严重缩小集群的容量,因为空间被保留在以前没有的地方。

    TLDF:除非你有充分的理由,否则不要碰这个。 (等到出现问题,直到出现瓶颈才优化)。用户可能会在他们的资源估计中犯一些无辜的错误,并且提高他们正确估计他们需要什么的能力可能会很痛苦。

    【讨论】:

    • 我已经在使用 DominantResourceCalculator。我没有资源分配的问题。我想知道的是 CPU 是如何在容器之间隔离的。一个容器可以使用不同的容器 CPU 吗? YARN 会自动处理像 Docker 这样的 cgroups 吗?在 Focker 中,我的容器不能使用超过分配的容量。
    • Yarn 确实使用 cgroups 来执行策略。
    • 在启动容器时它会自动执行此操作还是应该启用它?
    • 您可以自己查看容器日志并检查日志。我知道我已经看到它因为内存不足而杀死容器,并找出我通常查看容器日志的原因。这就是我知道它使用 cgroups 的方式,因为应用程序日志只会报告容器被杀死。
    猜你喜欢
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多