【发布时间】:2015-07-13 21:39:59
【问题描述】:
我正在用 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和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++ 遗留代码多线程。当我完成我的研究时,我将用实验结果更新这篇文章。
【问题讨论】:
-
从您的更新中,我似乎不清楚您是如何得出结论,即最好限制并行任务的数量并依赖您的 C++ 代码多线程。
-
好吧,我实际上正在运行一组特定的实验,以检查依赖通常的遗留多线程或使用 Spark 方法是否更有趣。我在谷歌云上运行,在我的 specific 图像处理案例中,最好的折衷方案是:对于具有 N 个内核的工作人员,使用 spark 有 N/2 个并行作业,每个作业使用 openMP 在 2 个线程上多线程.例如:8 个工作节点,16 个内核,最好的折衷方案是 64 个并行作业,每个作业在 2 个内核上进行多线程处理。相反(16 个并行作业,每个在 MT 上超过 8 个内核的速度要慢两倍)。
-
感谢您的称赞。
标签: multithreading hadoop apache-spark pyspark cpu-cores