我正在 Spark 中开发一个项目,最近从使用 Spark Standalone 切换到使用 Mesos 进行集群管理。我现在发现自己对新系统下提交作业时如何分配资源感到困惑。
在独立模式下,我使用了类似的东西(遵循一些建议这篇 Cloudera 博客文章 http://blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark-jobs-part-2/:
/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
and --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 列出了“框架”,我认为它对应于独立 UI 中的“作业”。但是,当我单击给定框架的详细信息时,它会列出“任务”。但这些不可能是实际的 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 个)。考虑到我无法指定--executor-cores
在 Mesos 中,我该如何实现这一点?或者出于某种原因我什至想要完成这个任务,但我是否偏离了基地? Mesos 是否不允许每个节点有多个执行器?