我在Spark工作,最近从使用Spark Standalone转向Mesos进行集群管理。我现在发现自己在如何在新系统下提交作业时分配资源时感到困惑。
在独立模式下,我使用的是这样的内容(遵循this Cloudera blog post的一些建议:
/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独立和YARN,这使得指定分配的执行者和资源的总数对每一个困难。说我跑这个:
/opt/spark/bin/spark-submit --total-executor-cores 240 --executor-memory 16G --conf spark.mesos.coarse=true myscript.py
当我在Mesos Web UI中检查这项工作时,事情开始变得混乱。所以,这是我的问题:
术语。 Web UI列出"框架",我假设它们对应于" jobs"在独立UI中。但是,当我点击给定框架的详细信息时,它会列出" tasks"。但这些不是实际的Spark任务,对吗?据我所知,"任务"这里必须实际意味着"执行者"就Spark而言。这与UI说我的框架(作业)有:15个活动任务,240个CPU和264GB内存。
264/15 = 17.6,这似乎与我指定的每个执行程序的16GB内存一致(加上一些开销,我猜)。我是否正确地解释了这一切?
假设是的,当我检查这些"任务中的任何一个" (执行者)我看到每个都分配了16个核心。鉴于我们每台机器有16个核心,这似乎表明我基本上在16台机器上运行了一个执行器,并且每个执行器都获得了完整的16个核心,但只有16 GB的RAM。 (请注意,即使我将--executor-memory
向下放到类似4GB的内容,mesos仍然只为每个节点运行一个执行程序,具有16个内核和4GB RAM。但我想要完成的事情就像我的前两个例子。也就是说,我希望每个节点运行多个执行程序,每个执行程序共享该节点的RAM和核心(即中等数量的核心预执行程序,5-8)。考虑到我无法在Mesos中指定--executor-cores
,我该如何做到这一点?或者我是否因为某种原因离开基地甚至想要完成这个? Mesos只是不允许每个节点有多个执行器吗?
答案 0 :(得分:4)
问题1: 在粗粒度模式下,Spark的执行程序(org.apache.spark.executor.CoarseGrainedExecutorBackend)作为Mesos任务启动。 Mesos Framework实际上是Spark Driver。一个Spark Driver可以提交多个Spark作业。这取决于您的Spark应用程序。 Spark和Mesos都来自加州大学伯克利分校的AMPLab并且是并行开发的,所以他们使用类似的术语(执行者,任务...),这可能会让你感到困惑: - )。
问题2: 在粗粒度模式下,Spark每个主机只启动一个执行程序(有关详细信息,请参阅https://issues.apache.org/jira/browse/SPARK-5095)。因此,对于您来说,Spark将为每个主机启动一个执行程序(每个执行程序消耗16G内存,并且如果没有其他工作负载,则主机中的所有可用内核为16个内核),直到执行程序的总核心达到240个内核。将有240/16 = 15个执行者。
关于spark.mesos.mesosExecutor.cores,它仅适用于细粒度模式。在细粒度模式下,Spark将为每个主机启动一个执行程序(org.apache.spark.executor.MesosExecutorBackend)。即使没有任务,执行程序也会消耗spark.mesos.mesosExecutor.cores的核心数。每个任务都将使用另外数量的spark.task.cpus核心。
答案 1 :(得分:0)
关于1)
这也是我的理解。 Mesos Task实际上是Spark Executor(任务)。
关于2)
根据我的理解,您应该能够使用spark.mesos.mesosExecutor.cores
配置属性:
(仅限细粒度模式)为每个Mesos执行程序提供的核心数。这不包括用于运行Spark任务的核心。换句话说,即使没有运行Spark任务,每个Mesos执行器也将占用此处配置的核心数。该值可以是浮点数。
见