首页 文章

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

提问于
浏览
10

我正在使用python包装的C代码运行一个spark集群 . 我目前正在测试多线程选项的不同配置(在Python级别或Spark级别) .

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

从我所看到的,默认情况下,Spark每个节点启动4个从站(我一次有4个python在从属节点上工作) .

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

我将运行测试以获得一个清晰的想法,但如果知识渊博的人知道这个选项的作用,它可能有所帮助 .

Update :

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

  • 默认情况下,我有 one executor per worker node (此处有10个工作节点,因此有10个执行程序)

  • 但是,每个工作人员都可以运行 several tasks in parallel . 在独立模式下,默认行为是使用所有可用内核,这解释了为什么我可以观察4 python .

  • 为了限制每个worker使用的核心数量,并限制并行任务的数量,我至少有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 回答

  • 3

    要确保在每个从站上启动了多少工作人员,请打开Web浏览器,键入http://master-ip:8080,然后查看 workers 部分,了解有多少工作人员已准确启动,以及哪个工作人员在哪个工作人员上 . (我在上面提到这些是因为我不确定你说'4 slaves per node'是什么意思)

    默认情况下,spark会在每个slave上启动精确的1个worker,除非你在conf / spark-env.sh中指定 SPARK_WORKER_INSTANCES=n ,其中 n 是你想在 each slave上启动的worker实例的数量 .

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

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

    文档似乎并不清楚 .

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

相关问题