Spark 调度程序池在 YARN 上运行时如何工作?



我混合了Spark版本(1.6,2.0,2.1)都部署在YARN(Hadoop 2.6.0/CDH 5.5)上。我试图保证某个应用程序永远不会在我们的 YARN 集群上缺乏资源,无论那里可能运行什么。

我已经启用了随机播放服务并设置了一些公平调度程序池,如 Spark 文档中所述。我为我希望永远不会缺少资源的高优先级应用程序创建了一个单独的池,并为其提供了minShare资源:

<?xml version="1.0"?>
<allocations>
<pool name="default">
<schedulingMode>FAIR</schedulingMode>
<weight>1</weight>
<minShare>0</minShare>
</pool>
<pool name="high_priority">
<schedulingMode>FAIR</schedulingMode>
<weight>1</weight>
<minShare>24</minShare>
</pool>
</allocations>

当我在 YARN 群集上运行 Spark 应用程序时,我可以看到我配置的池被识别:

17/04/04 11:38:20 INFO scheduler.FairSchedulableBuilder: Created pool default, schedulingMode: FAIR, minShare: 0, weight: 1
17/04/04 11:38:20 INFO scheduler.FairSchedulableBuilder: Created pool high_priority, schedulingMode: FAIR, minShare: 24, weight: 1

但是,我没有看到我的应用程序正在使用新的high_priority池,即使我在调用spark-submit时设置了spark.scheduler.pool。因此,这意味着当群集与常规活动挂钩时,我的高优先级应用程序无法获得所需的资源:

17/04/04 11:39:49 INFO cluster.YarnScheduler: Adding task set 0.0 with 1 tasks
17/04/04 11:39:50 INFO scheduler.FairSchedulableBuilder: Added task set TaskSet_0 tasks to pool default
17/04/04 11:39:50 INFO spark.ExecutorAllocationManager: Requesting 1 new executor because tasks are backlogged (new desired total will be 1)
17/04/04 11:40:05 WARN cluster.YarnScheduler: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources

我在这里错过了什么?我和我的同事尝试在 YARN 中启用抢占,但这没有任何作用。然后我们意识到 YARN 中有一个概念与 Spark 调度程序池非常相似,称为 YARN 队列。所以现在我们不确定这两个概念是否以某种方式冲突。

如何让高优先级池按预期工作?Spark 调度程序池和 YARN 队列之间是否存在某种冲突?

Spark-users列表中的某个人澄清了一些事情,解释了为什么我没有得到我期望的东西:Spark 调度程序池用于管理应用程序中的资源,而 YARN 队列用于跨应用程序管理资源。我需要后者,并且错误地使用了前者。

这在作业计划下的 Spark 文档中进行了说明。我只是被粗心的阅读加上 Spark 技术意义上的"job"(即 Spark 应用程序中的操作)和"job"的混淆所咬伤,因为我的同事和我通常使用它来表示提交到集群的应用程序。

相关内容

  • 没有找到相关文章

最新更新