【问题标题】:Using spark-submit, what is the behavior of the --total-executor-cores option?使用 spark-submit, --total-executor-cores 选项的行为是什么?
【发布时间】:2015-07-13 21:39:59
【问题描述】:

我正在用 Python 封装的 C++ 代码运行 Spark 集群。 我目前正在测试多线程选项的不同配置(在 Python 级别或 Spark 级别)。

我在 HDFS 2.5.4 集群上使用带有独立二进制文件的 spark。该集群目前由 10 个从站组成,每个从站有 4 个核心。

据我所知,默认情况下,Spark 每个节点启动 4 个从属节点(我有 4 个 python 一次在一个从属节点上工作)。

如何限制这个数字?我可以看到我有一个用于“spark-submit”的 --total-executor-cores 选项,但是关于它如何影响集群中执行程序的分布的文档很少!

我将运行测试以获得清晰的概念,但如果有知识的人知道此选项的作用,它可能会有所帮助。

更新:

我再次浏览了spark文档,这是我的理解:

  • 默认情况下,我每个工作节点有一个执行程序(这里有 10 个工作程序节点,因此有 10 个执行程序)
  • 但是,每个工作人员可以并行运行多个任务。在独立模式下,默认行为是使用所有可用内核,这解释了为什么我可以观察到 4 个 python。
  • 为了限制每个工作人员使用的核心数量,并限制并行任务的数量,我至少有 3 个选项:
    • 使用--total-executor-coresspark-submit(最不满意,因为不知道如何处理核心池)
    • 在配置文件中使用SPARK_WORKER_CORES
    • 在启动脚本中使用-c 选项

本文档http://spark.apache.org/docs/latest/spark-standalone.html 的以下几行帮助我弄清楚发生了什么:

SPARK_WORKER_INSTANCES
在每台机器上运行的工作实例数(默认值:1)。 如果你有非常大的机器并且想要多个 Spark 工作进程,你可以使这个大于 1。 如果您确实设置了此项,请确保还明确设置 SPARK_WORKER_CORES 以限制每个工作人员的核心,否则每个工作人员将尝试使用所有核心。

我仍然不清楚的是,为什么在我的情况下最好将每个工作节点的并行任务数限制为 1,并依赖我的 C++ 遗留代码多线程。当我完成我的研究时,我将用实验结果更新这篇文章。

【问题讨论】:

  • 从您的更新中,我似乎不清楚您是如何得出结论,即最好限制并行任务的数量并依赖您的 C++ 代码多线程。
  • 好吧,我实际上正在运行一组特定的实验,以检查依赖通常的遗留多线程或使用 Spark 方法是否更有趣。我在谷歌云上运行,在我的 specific 图像处理案例中,最好的折衷方案是:对于具有 N 个内核的工作人员,使用 spark 有 N/2 个并行作业,每个作业使用 openMP 在 2 个线程上多线程.例如:8 个工作节点,16 个内核,最好的折衷方案是 64 个并行作业,每个作业在 2 个内核上进行多线程处理。相反(16 个并行作业,每个在 MT 上超过 8 个内核的速度要慢两倍)。
  • 感谢您的称赞。

标签: multithreading hadoop apache-spark pyspark cpu-cores


【解决方案1】:

文档似乎不清楚。

根据我的经验,分配资源的最常见做法是指定执行器的数量和每个执行器的核心数,例如(取自here):

$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn-cluster \
--num-executors 10 \
--driver-memory 4g \
--executor-memory 2g \
--executor-cores 4 \
--queue thequeue \
lib/spark-examples*.jar \
10

然而,根据this,这种方法仅限于 YARN,不适用于独立和基于 Mesos 的 Spark

相反,可以使用参数--total-executor-cores,它表示分配给Spark 作业的所有执行程序的内核总数。在您的情况下,总共有 40 个内核,设置属性 --total-executor-cores 40 将利用所有可用资源。

不幸的是,当提供的资源少于可用资源总量时,我不知道 Spark 如何分配工作负载。但是,如果同时处理两个或多个作业,它应该对用户透明,因为 Spark(或任何资源管理器)将根据用户设置管理资源的管理方式。

【讨论】:

  • 谢谢,从我的第一次实验来看,核心似乎分布在可用的执行程序中(没有将执行程序设置为零核心)。
  • 这就是我认为它会做的事情。然而,这是一个有趣的事实,现已得到证实。
【解决方案2】:

要确定每个从属服务器上启动了多少工作人员,请打开网络浏览器,输入http://master-ip:8080,然后查看workers 部分,了解确切启动了多少工作人员,以及哪个工作人员在哪个从服务器上启动。 (我在上面提到这些是因为我不确定您所说的“每个节点 4 个从站”是什么意思)

默认情况下,除非您指定,否则 spark 会在每个从属设备上启动 1 个工作线程 SPARK_WORKER_INSTANCES=n 在 conf/spark-env.sh 中,其中 n 是您希望在 每个 从属设备上启动的工作实例的数量。

当您通过 spark-submit 提交 spark 作业时,spark 将为您的作业启动一个应用程序驱动程序和多个执行程序。

  • 如果没有明确指定,spark 将为每个 worker 启动一个 executor,即总 executor num 等于总 worker num,并且所有 core 都可用于该作业。
  • 您指定的--total-executor-cores 将限制此应用程序可用的内核总数。

【讨论】:

  • 感谢您的回答,我更新了我的帖子,明确区分了“执行者”和“任务”
  • 我在 EMR 上使用 Spark,但我在 8080 上没有任何东西?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2016-12-19
  • 2023-03-10
相关资源
最近更新 更多