2015-05-04 33 views
9

我正在用python包装的C++代码运行spark集群。 我目前正在测试多线程选项的不同配置(在Python级别或Spark级别)。Apache spark,spark-submit,--total-executor-cores选项的行为是什么

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

从我可以看到,默认情况下,Spark启动每个节点4个从站(我有4个Python一次在从站节点上工作)。

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

我会运行测试以获得一个清晰的想法,但如果知情的人知道这个选项的作用,它可以提供帮助。

更新:

我通过火花文档又去,这里是我的理解:

  • 默认情况下,我有每个工作节点(这里10名工人节点一个执行者,因此10执行者)
  • 但是,每个工人可以并行运行几个任务。在独立模式下,默认行为是使用所有可用的内核,这就解释了为什么我可以观察到4个python。
  • 要限制每个工人使用的核心数量,并限制的并行任务的数量,我至少有3个选项:
    • 使用--total-executor-cores蒙山​​(最不令人满意,因为是不知道如何池芯被处理)
    • 使用SPARK_WORKER_CORES在配置文件中
    • 使用-c选项与起始脚本

本文档http://spark.apache.org/docs/latest/spark-standalone.html的以下行帮助我弄清楚是怎么回事:

SPARK_WORKER_INSTANCES
工人实例的数量在每台机器上运行(默认为1)。 如果您有非常大的机器并且想要多个Spark工作进程,那么您可以将其设置为1以上。 如果您确实设置了此项,请确保也明确设置SPARK_WORKER_CORES以限制每个工作者的内核数量,否则每个工作人员都会尝试使用所有内核。

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

+0

从你的更新中,我不清楚的是你如何得出结论:限制并行任务的数量并依赖于你的C++代码多线程更好。 –

+0

嗯,实际上我正在运行一组特定的实验,以检查它是否更依赖通常的传统多线程或使用Spark方法。我在谷歌云上运行,并且在我的_specific_图像处理案例中,最好的折衷办法是:对于具有N个内核的工作者,使用spark具有N/2个并行作业,每个作业使用openMP在2个线程上多线程化。例如:8个工作站节点有16个内核,最好的折衷方案是64个并行作业,并且每个都在2个内核上多线程。相反(16个并行作业,其中每个超过8个核心的MT减慢两倍)。 – MathiasOrtner

+0

感谢您的称赞。 –

回答

2

要确保每个从站上有多少员工启动,请打开Web浏览器,输入http://master-ip:8080,然后查看workers部分,了解有多少员工已准确启动,以及哪个员工在哪个从站上。 (我提到这些上面,因为我不知道你是什么意思说的“每个节点4个奴”)

默认情况下,除非你指定的conf /火花ENV SPARK_WORKER_INSTANCES=n火花将开始确切1名工人每个奴隶.sh,其中n是您想要在每个奴隶上启动的工作者实例的数量。

当您通过spark-submit提交spark工作时,spark会为您的工作启动一个应用程序驱动程序和多个executor。

  • 如果没有明确指定,spark会为每个工作者启动一个执行器,即总执行器数量等于总工作器数量,并且所有内核都可用于该作业。您指定的
  • --total-executor-cores会限制此应用程序可用的总核心数。
+0

感谢您的回答,我更新了我的帖子,明确区分了“执行者”和“任务” – MathiasOrtner

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 

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

取而代之,可以使用参数--total-executor-cores,它代表分配给Spark作业的所有执行者的核的总数量。在你的情况下,总共有40个核心,设置属性--total-executor-cores 40将利用所有可用资源。

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

+0

谢谢,从我的第一个实验来看,它看起来像核心分布在可用执行者之间(没有执行者设置为零核心)。 – MathiasOrtner

+0

这就是我认为它会做的。但是,现在已经证明这是一个有趣的事实。 –

相关问题