启用Spark动态资源分配后,所有资源都将分配给可用的第一个提交作业,从而导致后续应用程序排队。要允许应用程序并行获取资源,请将资源分配给池并在这些池中运行应用程序,并使池中运行的应用程序能够被抢占。
我自己也观察过这种行为,但是我目前正在开发一个只有2个节点(EMR上为m3.xlarge)和1个master(r3.xlarge)的小型集群。我所看到的是,如果我提交多个spark应用程序(对spark-submit
的不同调用),当我在EMR上查找我的资源管理器时,所有应用程序都会被接受但只有一个一次运行
现在这可能是因为我正在阅读大约2GB的文件并且我的资源已经超出。我还尝试使用Spark中现有的spark-submit
示例进行一些pi.py
调用。在这种情况下,我可以在运行状态下看到多个作业。
鉴于此,Cloudera文档是正确的还是误导性的?如果我有一个更大的集群,我会看到多个应用程序并行运行吗?
答案 0 :(得分:0)
Spark动态分配
动态分配带有上下执行程序扩展的策略,如下所示:
当存在待处理任务时,扩展策略会请求新执行程序,并且由于执行程序启动缓慢且Spark应用程序可能需要更多,因此会以指数方式增加执行程序数。
缩小规则删除已为spark.dynamicAllocation.executorIdleTimeout秒空闲的执行程序。
Cloudera资源到池
所以cloudera说的是,由于任务未决,可能只有一份工作可能会占用所有资源,请创建纱线问题并为每个问题分配特定数量的资源。请点击链接如何创建纱线问题。
以上案例 情景1
在您的工作中可能会有更多待处理任务,并且由于动态资源分配,大部分资源都会分配给单个作业,即使您提交了下一个应用程序,它也会因资源而处于等待状态。
场景2
当您运行这些示例时,作业所需的资源可能是较少的任务,动态分配不会旋转更多的执行程序(因为没有待处理的任务)。由于群集中有额外的(未分配的)资源,下一个应用程序正在运行而不是等待状态。