理解mesos上spark作业的资源分配

oyxsuwqo  于 2021-06-21  发布在  Mesos
关注(0)|答案(2)|浏览(328)

我在spark上做一个项目,最近从使用spark单机版切换到mesos进行集群管理。在新系统下提交作业时,我发现自己对如何分配资源感到困惑。
在独立模式下,我使用的是这样的东西(以下是cloudera博客文章中的一些建议:

/opt/spark/bin/spark-submit --executor-memory 16G --executor-cores 8 
    --total-executor-cores 240 myscript.py

这是在一个集群上,其中每台机器有16个内核和~32 gb ram。
这样做的好处是我可以很好地控制运行的执行器的数量和分配给每个执行器的资源。在上面的例子中,我知道我得到了240/8=30个执行器,每个执行器有16gb内存和8个内核。给定集群中每台机器上的内存,这相当于每台机器上运行的执行器不超过两个。如果我想要更多的遗嘱执行人,我可以做

/opt/spark/bin/spark-submit --executor-memory 10G --executor-cores 5 
    --total-executor-cores 240 myscript.py

这将给我240/5=47个执行器,每个执行器有5个内核和10gb内存,每台机器最多允许3个执行器。
但现在我上了mesos,我有点困惑了。首先,我在粗粒度模式下运行,以确保可以修复和控制资源分配(这是在相当复杂的模型中,我们希望在其中预分配资源)。
现在,我可以指定 --total-executor-cores 以及 --executor-memory 但文件告诉我 --exeuctor-cores 仅适用于spark standalone和yarn,这使得很难指定分配给每个应用程序的执行器和资源的总数。假设我运行这个:

/opt/spark/bin/spark-submit --total-executor-cores 240 --executor-memory 16G --conf spark.mesos.coarse=true myscript.py

当我在mesoswebui中检查这个工作时,事情开始变得混乱起来。所以,我的问题是:
术语。webui列出了“frameworks”,我假设它对应于独立ui中的“jobs”。但是当我单击给定框架的细节时,它会列出“任务”。但这些不可能是真正的Spark任务,对吧?据我所知,“任务”在这里必须实际上意味着“执行者”的Spark是关心。这与我的框架(job)有15个活动任务、240个cpu和264gb内存的ui是一致的。
264/15=17.6,这似乎与我指定的每个执行器的16gb内存一致(我猜还有一些开销)。我对这一切的解释正确吗?
假设是,当我检查这些“任务”(executors)时,我看到每个任务都分配了16个核心。假设我们每台机器有16个内核,这似乎表明我基本上是在16台机器中的每台机器上运行一个执行器,每个执行器得到的是完整的16个内核,但只有16gb的ram(注意,即使我掉下去 --executor-memory 到了4gb,mesos仍然是每个节点运行一个执行器,有16个内核和4gb内存)。但我想完成的是我的前两个例子。也就是说,我希望在每个节点上运行多个执行器,每个执行器共享该节点的ram和核心(即,预执行器的核心数量适中,5-8个)。考虑到我不能具体说明 --executor-cores 在mesos中,我如何实现这一点?或者我是不是因为某种原因想完成这个任务呢?mesos不允许每个节点有多个executor吗?

vsaztqbk

vsaztqbk1#

关于1)
这也是我的理解。mesos任务实际上是一个spark执行器(task)。
关于(2)
据我所知,你应该可以使用 spark.mesos.mesosExecutor.cores 配置属性:
(仅限细粒度模式)提供给每个mesos执行器的核心数。这不包括用于运行spark任务的内核。换句话说,即使没有运行spark任务,每个mesos执行器也将占用这里配置的内核数。该值可以是浮点数。
看见
http://spark.apache.org/docs/latest/running-on-mesos.html#spark-属性

kfgdxczn

kfgdxczn2#

问题1:在粗粒度模式下,spark的executor(org.apache.spark.executor.coarsegrainedeexecutorbackend)作为mesos任务启动。mesos框架实际上是一个Spark驱动程序。一个spark驱动程序可以提交多个spark作业。这取决于你的Spark应用。spark和mesos都来自加州大学伯克利分校的amplab,并且是并行开发的,所以它们使用类似的术语(executor,task…),这可能会让你困惑:-)。
问题2:在粗粒度模式下,spark每个主机只启动一个executor(请参阅https://issues.apache.org/jira/browse/spark-5095 详细信息)。因此,对于您的情况,spark将为每个主机启动一个executor(每个executor占用16g内存,如果没有其他工作负载,则占用主机中所有可用的内核16个),直到executors的内核总数达到240个。将有240/16=15名执行人。
对于spark.mesos.mesosexecutor.cores,它只适用于细粒度模式。在细粒度模式下,spark将为每个主机启动一个executor(org.apache.spark.executor.mesosexecutorbackend)。即使没有任务,执行器也会消耗spark.mesos.mesosexecutor.cores的内核数。每个任务将消耗另一个数量的spark.task.cpu内核。

相关问题