使用spark-submit, - length-executor-cores选项的行为是什么?

时间:2015-05-04 13:19:25

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

我正在用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-cores whith spark-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 ++遗留代码多线程更好。当我完成学习时,我会用实验结果更新这篇文章。

2 个答案:

答案 0 :(得分:4)

要确保每个奴隶开始有多少工作人员,请打开网络浏览器,输入http://master-ip:8080,然后查看SPARK_WORKER_INSTANCES=n部分,了解有多少工作人员已准确启动,以及哪个工作人员在哪个工作人员。 (我在上面提到这些是因为我不确定你说每个节点有4个奴隶')

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

当你通过spark-submit提交一个spark工作时,spark会为你的工作启动一个应用程序驱动程序和几个执行程序。

  • 如果未明确指定,spark将为每个worker启动一个执行程序,即总执行程序num等于总worker数,并且所有核都可用于此作业。
  • 您指定的
  • Person将限制此应用程序可用的总核心数。

答案 1 :(得分:4)

文档似乎不太明确。

根据我的经验,分配资源的最常见做法是指示执行程序的数量和每个执行程序的核心数,例如(取自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 (或任何资源管理器)将根据用户设置管理资源的管理方式。