尽管内存可用,YARN 作业仍停留在 ACCEPTED 状态

YARN jobs getting stuck in ACCEPTED state despite memory available

集群进入死锁状态并停止分配容器,即使 GB 的 RAM 和 Vcor​​es 可用也是如此。

只有当我们并行启动大量作业时才会发生这种情况,其中大多数是 Oozie 作业,其中包含许多 forked 操作。

经过大量搜索和阅读相关问题和文章后,我们遇到了一个名为 maxAMShare 的 属性 用于 YARN 作业调度程序(我们正在使用 Fair Scheduler)。

什么意思?

可分配给 Application Master 的用户队列共享内存和 vcore 的百分比。默认值:0.5 (50%)。 Source

死锁是怎么造成的?

当我们将并行启动多个 oozie 作业时,每个 oozie 作业和分叉操作都需要首先为 oozie 启动器分配几个 ApplicationMaster 容器,然后启动其他容器来执行实际的操作任务。

在我们的案例中,我们实际上并行启动了大约 20-30 个 oozie 作业,每个作业都有近 20 个分叉操作。由于每个操作都需要 2 个 ApplicationMaster,因此仅 Oozie ApplicationMaster 就阻止了近 800 个容器。

因此,我们达到了用户队列的 50% 默认 maxAMShare 限制。 YARN 不允许为 运行 实际工作创建新的 ApplicationMaster。

解决方案?

  1. 一个直接的建议是通过将 属性 设置为 -1.0 来禁用检查。但不推荐这样做。您可能再次将所有或大部分资源分配给 AM,而实际完成的工作将非常少。

  2. 其他选项(我们继续使用)是在 oozie 配置中为 AM 指定一个单独的队列,然后将 maxAMShare 属性 设置为 1.0。通过这种方式,您可以控制在不影响其他作业的情况下可以分配多少资源给 AM。 Reference

<global>
    <configuration>
        <property>
            <name>oozie.launcher.mapred.job.queue.name</name>
            <value>root.users.oozie_am_queue</value>
        </property>
    </configuration>
</global>

希望这能为面临相同问题的人们节省大量时间。死锁也可能有许多其他原因,这些原因已经在 SO 的其他问题中讨论过。