【发布时间】:2020-11-30 14:01:09
【问题描述】:
在 Spark 中,一次并行执行多少个任务?讨论见于 How are stages split into tasks in Spark? 和 How DAG works under the covers in RDD?
但我没有找到明确的结论。
考虑以下场景(假设spark.task.cpus = 1,为简单起见忽略vcore 概念):
- 10个执行器(2核/执行器),10个分区=>我认为一次并发任务的数量是10
- 10个执行器(2核/执行器),2个分区=>我认为一次并发任务的数量是2
- 10个执行器(2核/执行器),20个分区=>我认为一次并发任务的数量是20
- 10个executors(1 cores/executor),20个partitions =>我认为一次并发任务数是10
我说的对吗?关于第三种情况,在一个执行器内部考虑多线程(即2个线程,因为有2个内核)会是20吗?
更新1
如果第三种情况正确,则表示:
- 当执行器中的空闲内核可用时,Spark 可以自动决定触发该执行器中的多线程
- 当执行器中只有一个核心时,该执行器中不会发生多线程。
如果这是真的,Spark 在执行器中的行为是不是有点不确定(单线程与多线程)?
请注意,从驱动程序发送到执行程序的代码可能没有考虑使用例如自动性问题。 同步关键字。
Spark 是如何处理的?
【问题讨论】:
-
你是对的(包括第三种情况)。要考虑的另一个因素是 vcore。在 Hortonworks/Cloudera 上,管理员可以选择将单个物理核心拆分为设置的虚拟核心。每个虚拟核心都可以在分区上执行任务。
-
最常见的情况更正。然而,有一个
spark.task.cpus设置可以改变它。 stackoverflow.com/questions/36671832/… -
@mazaneicha 感谢您的评论。但我认为
spark.task.cpus是关于 nb 的。 cpus 每个任务,而我的问题是关于 nb。任务,这是不同的,但你的链接也很有趣。 :) -
如果你为每个任务分配 2 个 cpu,那么一个有 4 个核心的 executor 将只能同时运行 2 个任务,而通常它会运行 4 个。
-
@mazaneicha 有道理,我将假设
spark.task.cpus = 1放在问题中。但是这里你说的是一个任务中的多线程(1个任务有2个线程),问题更多的是任务之间的多线程(1个任务有1个线程,但是2个任务在一个执行器中同时运行)
标签: java multithreading apache-spark concurrency hadoop-yarn