首页 文章

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

提问于
浏览
6

我正在开发一个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个 Actuator ,每个 Actuator 有16GB内存和8个内核 . 给定群集中每台计算机上的内存,这相当于每台计算机上运行的执行程序不超过两个 . 如果我想要更多的执行者,我可以做类似的事情

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

现在这将给我240/5 = 47个 Actuator ,每个 Actuator 具有5个内核和10GB内存,并且每台机器最多允许3个 Actuator .

但现在我在使用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列出了“框架”,我假设它与独立UI中的“作业”相对应 . 但是当我点击给定框架的细节时,它会列出“任务” . 但这些不能是Spark的实际任务,对吗?据我所知,就任务而言,“任务”实际上必须意味着“执行者” . 这与UI说我的框架(作业)具有以下内容是一致的:15个活动任务,240个CPU和264GB内存 .

264/15 = 17.6,这似乎与我指定的每个 Actuator 的16GB内存一致(加上一些开销,我猜) . 我是否正确地解释了这一切?

  • 假设是的,当我检查这些"tasks"(执行程序)中的任何一个时,我看到每个都分配了16个核心 . 鉴于我们每台机器有16个核心,这似乎表明我基本上在16台机器上运行一个 Actuator ,并且每个 Actuator 都获得了完整的16个核心,但只有16 GB的RAM . (请注意,即使我将 --executor-memory 方式降低到类似4GB的容量,mesos仍然只为每个节点运行一个执行程序,具有16个内核和4GB RAM) . 但我想要完成的事情就像我的前两个例子 . 也就是说,我希望每个节点运行多个执行程序,每个执行程序共享该节点的RAM和核心(即中等数量的核心预执行程序,5-8) . 考虑到我无法在Mesos中指定 --executor-cores ,我该如何做到这一点?或者我是否因为某种原因离开基地甚至想要实现这一目标? Mesos只是不允许每个节点有多个 Actuator 吗?

2 回答

  • 0

    问题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核心 .

  • 4

    Concerning 1)

    这也是我的理解 . Mesos Task实际上是Spark Executor(任务) .

    Concerning 2)

    根据我的理解,您应该能够使用 spark.mesos.mesosExecutor.cores 配置属性:

    (仅限细粒度模式)为每个Mesos执行程序提供的核心数 . 这不包括用于运行Spark任务的核心 . 换句话说,即使没有运行Spark任务,每个Mesos Actuator 也将占用此处配置的核心数 . 该值可以是浮点数 .

    看到

相关问题