我正在用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++遗留代码多线程更好。当我完成我的学习时,我会用实验结果更新这篇文章。
从你的更新中,我不清楚的是你如何得出结论:限制并行任务的数量并依赖于你的C++代码多线程更好。 –
嗯,实际上我正在运行一组特定的实验,以检查它是否更依赖通常的传统多线程或使用Spark方法。我在谷歌云上运行,并且在我的_specific_图像处理案例中,最好的折衷办法是:对于具有N个内核的工作者,使用spark具有N/2个并行作业,每个作业使用openMP在2个线程上多线程化。例如:8个工作站节点有16个内核,最好的折衷方案是64个并行作业,并且每个都在2个内核上多线程。相反(16个并行作业,其中每个超过8个核心的MT减慢两倍)。 – MathiasOrtner
感谢您的称赞。 –