了解 mesos 上 spark 作业的资源分配
Understanding resource allocation for spark jobs on mesos
我正在 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。
这样做的好处是我可以很好地控制执行程序的数量 运行ning 以及分配给每个执行程序的资源。在上面的例子中,我知道我得到了 240/8=30 个执行器,每个执行器有 16GB 内存和 8 个内核。给定集群中每台机器上的内存,每台机器上不超过两个执行器 运行ning。如果我想要更多的执行者,我可以做类似
/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
当我在 Mesos web UI 中检查此作业时,事情开始变得混乱。所以,这是我的问题:
术语。 Web UI 列出了 "frameworks",我假设它对应于独立 UI 中的 "jobs"。但是当我单击给定框架的详细信息时,它会列出 "tasks"。但这些不可能是实际的 Spark 任务,对吧?据我所知,就 Spark 而言,这里的 "task" 实际上必须意味着 "executor"。这与 UI 说我的框架(作业)有:15 个活动任务、240 个 CPU 和 264GB 内存是一致的。
264/15=17.6,这似乎与我指定的每个执行程序 16GB 内存一致(我猜加上一些开销)。我对这一切的解释是否正确?
假设是,当我检查这些 "tasks"(执行程序)中的任何一个时,我看到每个都分配了 16 个核心。鉴于我们每台机器有 16 个内核,这似乎表明我基本上 运行 在 16 台机器的每台机器上安装一个执行程序,并且每个执行程序都获得完整的 16 个内核,但只有 16 GB 的 RAM。 (请注意,即使我将 --executor-memory
降低到 4GB 之类的东西,mesos 仍然只有 运行 每个节点一个执行程序,具有 16 个内核和 4GB RAM)。但我想要完成的是我的前两个例子。也就是说,我想每个节点 运行 多个执行程序,每个执行程序共享该节点的 RAM 和内核(i.e.a 中等数量的预执行程序内核,5-8)。考虑到我无法在 Mesos 中指定 --executor-cores
,我该如何实现?还是出于某种原因我什至想完成这项工作而偏离了基地? Mesos 会不允许每个节点有多个执行器吗?
关于 1)
这也是我的理解。一个Mesos Task其实就是一个Spark Executor(任务)。
关于 2)
据我了解,您应该可以使用 spark.mesos.mesosExecutor.cores
配置 属性:
(Fine-grained mode only) Number of cores to give each Mesos executor. This does not include the cores used to run the Spark tasks. In other words, even if no Spark task is being run, each Mesos executor will occupy the number of cores configured here. The value can be a floating point number.
见
问题一:
在粗粒度模式下,Spark 的执行程序 (org.apache.spark.executor.CoarseGrainedExecutorBackend) 作为 Mesos 任务启动。 Mesos Framework 实际上就是 Spark Driver。一个 Spark Driver 可以提交多个 Spark 作业。这取决于您的 Spark 应用程序。 Spark 和 Mesos 都来自 UC Berkeley 的 AMPLab,并且是并行开发的,所以它们使用相似的术语(执行器,任务......),这可能会让你感到困惑:-)。
问题二:
在粗粒度模式下,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.
的核心数
我正在 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。
这样做的好处是我可以很好地控制执行程序的数量 运行ning 以及分配给每个执行程序的资源。在上面的例子中,我知道我得到了 240/8=30 个执行器,每个执行器有 16GB 内存和 8 个内核。给定集群中每台机器上的内存,每台机器上不超过两个执行器 运行ning。如果我想要更多的执行者,我可以做类似
/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
当我在 Mesos web UI 中检查此作业时,事情开始变得混乱。所以,这是我的问题:
术语。 Web UI 列出了 "frameworks",我假设它对应于独立 UI 中的 "jobs"。但是当我单击给定框架的详细信息时,它会列出 "tasks"。但这些不可能是实际的 Spark 任务,对吧?据我所知,就 Spark 而言,这里的 "task" 实际上必须意味着 "executor"。这与 UI 说我的框架(作业)有:15 个活动任务、240 个 CPU 和 264GB 内存是一致的。
264/15=17.6,这似乎与我指定的每个执行程序 16GB 内存一致(我猜加上一些开销)。我对这一切的解释是否正确?
假设是,当我检查这些 "tasks"(执行程序)中的任何一个时,我看到每个都分配了 16 个核心。鉴于我们每台机器有 16 个内核,这似乎表明我基本上 运行 在 16 台机器的每台机器上安装一个执行程序,并且每个执行程序都获得完整的 16 个内核,但只有 16 GB 的 RAM。 (请注意,即使我将
--executor-memory
降低到 4GB 之类的东西,mesos 仍然只有 运行 每个节点一个执行程序,具有 16 个内核和 4GB RAM)。但我想要完成的是我的前两个例子。也就是说,我想每个节点 运行 多个执行程序,每个执行程序共享该节点的 RAM 和内核(i.e.a 中等数量的预执行程序内核,5-8)。考虑到我无法在 Mesos 中指定--executor-cores
,我该如何实现?还是出于某种原因我什至想完成这项工作而偏离了基地? Mesos 会不允许每个节点有多个执行器吗?
关于 1)
这也是我的理解。一个Mesos Task其实就是一个Spark Executor(任务)。
关于 2)
据我了解,您应该可以使用 spark.mesos.mesosExecutor.cores
配置 属性:
(Fine-grained mode only) Number of cores to give each Mesos executor. This does not include the cores used to run the Spark tasks. In other words, even if no Spark task is being run, each Mesos executor will occupy the number of cores configured here. The value can be a floating point number.
见
问题一: 在粗粒度模式下,Spark 的执行程序 (org.apache.spark.executor.CoarseGrainedExecutorBackend) 作为 Mesos 任务启动。 Mesos Framework 实际上就是 Spark Driver。一个 Spark Driver 可以提交多个 Spark 作业。这取决于您的 Spark 应用程序。 Spark 和 Mesos 都来自 UC Berkeley 的 AMPLab,并且是并行开发的,所以它们使用相似的术语(执行器,任务......),这可能会让你感到困惑:-)。
问题二: 在粗粒度模式下,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.
的核心数