我正在运行一个用python Package 的c代码的spark集群。我目前正在测试多线程选项的不同配置(在python级别或spark级别)。
我在hdfs2.5.4集群上使用独立二进制文件的spark。集群目前由10个从机组成,每个从机有4个核心。
据我所见,默认情况下,spark为每个节点启动4个从属节点(一次有4个python在从属节点上工作)。
我怎么限制这个号码?我可以看到,对于“spark submit”,我有一个--total executor cores选项,但是很少有文档说明它如何影响集群中执行器的分布!
我将运行测试来获得一个清晰的想法,但如果有人知道这个选项的作用,它可能会有所帮助。
更新:
我再次阅读了spark文档,以下是我的理解:
默认情况下,每个worker节点有一个executor(这里是10个worker节点,因此是10个executors)
但是,每个worker可以并行运行多个任务。在独立模式下,默认行为是使用所有可用的内核,这就解释了为什么我可以观察python 4。
要限制每个辅助进程使用的内核数,并限制并行任务数,我至少有3个选项:
使用 --total-executor-cores
在哪里 spark-submit
(最不令人满意,因为没有关于如何处理堆芯的线索)
使用 SPARK_WORKER_CORES
在配置文件中
使用 -c
启动脚本的选项
本文档的以下行http://spark.apache.org/docs/latest/spark-standalone.html 帮我弄清楚发生了什么:
spark\u worker\u示例
要在每台计算机上运行的工作机示例数(默认值:1)。如果您有非常大的机器并且想要多个spark worker进程,那么您可以使其大于1。如果设置了此选项,请确保还显式设置spark\u worker\u cores以限制每个worker的内核,否则每个worker将尝试使用所有内核。
我仍然不清楚的是,在我的例子中,为什么最好将每个工作节点的并行任务数限制为1,并依赖于我的c遗留代码多线程处理。当我完成学业时,我会用实验结果更新这篇文章。
2条答案
按热度按时间1dkrff031#
要确定每个从属服务器上启动了多少个Worker,请打开web浏览器,键入http://master-ip:8080,并查看
workers
关于到底有多少工人已经开始工作,以及哪个工人在哪个奴隶身上工作(我提到以上这些是因为我不确定您所说的“每个节点4个从属节点”是什么意思)默认情况下,除非您指定,否则spark将在每个从属服务器上启动一个工作进程
SPARK_WORKER_INSTANCES=n
在conf/spark-env.sh中,其中n是希望在每个从机上启动的工作机示例数。当您通过spark submit提交spark作业时,spark将为您的作业启动一个应用程序驱动程序和多个执行器。
如果没有明确指定,spark将为每个worker启动一个executor,即total executor num等于total worker num,并且所有内核都可用于此作业。
--total-executor-cores
您指定的将限制此应用程序可用的内核总数。piah890a2#
文件似乎不清楚。
根据我的经验,分配资源最常见的做法是通过指示执行器的数量和每个执行器的核心数,例如(取自此处):
然而,这种方法仅限于Yarn,不适用于独立和基于mesos的spark。
相反,参数
--total-executor-cores
可以使用,它表示分配给spark作业的所有执行器的核心总数。在您的例子中,总共有40个核心,设置属性--total-executor-cores 40
将利用所有可用的资源。不幸的是,我不知道spark在提供的资源少于总可用资源时如何分配工作负载。但是,如果同时处理两个或多个作业,它应该对用户透明,因为spark(或任何资源管理器)将根据用户设置来管理资源的管理方式。