一个executor中有多少并发任务,Spark如何处理一个executor中任务间的多线程?
How many concurrent tasks in one executor and how Spark handles multithreading among tasks in one executor?
在Spark中,一次并行执行多少个任务?讨论见
How are stages split into tasks in Spark? 和
How DAG works under the covers in RDD?
但我没有找到明确的结论。
考虑以下场景(假设 spark.task.cpus = 1
,为简单起见忽略 vcore
概念):
- 10个executor(2cores/executor), 10个partitions => 我认为一次并发任务数是10
- 10个executor(2cores/executor), 2个partitions => 我认为一次并发任务数是2
- 10个executor(2cores/executor),20个partitions =>我认为一次并发任务数是20
- 10个executors(1cores/executor),20个partitions =>我认为一次并发任务数是10
我说的对吗?关于第3种情况,是否会20考虑一个执行器内的多线程(即2个线程,因为有2个内核)?
更新1
如果第3种情况正确,则表示:
- 当执行器中的空闲内核可用时,Spark 可以自动决定触发该执行器中的多线程
- 当执行器中只有一个核心时,该执行器中不会发生多线程。
如果是这样,Spark在一个executor中的行为是不是有点不确定(单线程v.s.多线程)?
请注意,从驱动程序发送到执行程序的代码可能没有考虑使用例如 automicity 问题。 同步关键字。
Spark 是如何处理的?
我认为你是对的,这取决于你的执行者数量和核心,一个分区在一个核心上创建一个任务运行。
我认为所有 4 个案例都是正确的,第 4 个案例在现实中是有意义的(“超额预订”核心)。对于 nb,我们通常应该考虑 2 到 4 的系数。分区,即 nb。分区数等于 nb 的 2 到 4 倍。集群中的总 cpu 个核心。
关于线程,一个执行器 运行 中的 2 个任务并发应该不会有关于 multi-threading 的问题,因为每个任务都在处理自己的一组 RDD
。
如果设置了 spark.task.cpus = 2
,这意味着每个任务有 2 cpu 个核心,那么 IMO 可能存在竞争条件问题(如果有 var
),但通常我们是处理像 RDD
这样的不可变值,所以也应该只是有问题。
在Spark中,一次并行执行多少个任务?讨论见 How are stages split into tasks in Spark? 和 How DAG works under the covers in RDD?
但我没有找到明确的结论。
考虑以下场景(假设 spark.task.cpus = 1
,为简单起见忽略 vcore
概念):
- 10个executor(2cores/executor), 10个partitions => 我认为一次并发任务数是10
- 10个executor(2cores/executor), 2个partitions => 我认为一次并发任务数是2
- 10个executor(2cores/executor),20个partitions =>我认为一次并发任务数是20
- 10个executors(1cores/executor),20个partitions =>我认为一次并发任务数是10
我说的对吗?关于第3种情况,是否会20考虑一个执行器内的多线程(即2个线程,因为有2个内核)?
更新1
如果第3种情况正确,则表示:
- 当执行器中的空闲内核可用时,Spark 可以自动决定触发该执行器中的多线程
- 当执行器中只有一个核心时,该执行器中不会发生多线程。
如果是这样,Spark在一个executor中的行为是不是有点不确定(单线程v.s.多线程)?
请注意,从驱动程序发送到执行程序的代码可能没有考虑使用例如 automicity 问题。 同步关键字。
Spark 是如何处理的?
我认为你是对的,这取决于你的执行者数量和核心,一个分区在一个核心上创建一个任务运行。
我认为所有 4 个案例都是正确的,第 4 个案例在现实中是有意义的(“超额预订”核心)。对于 nb,我们通常应该考虑 2 到 4 的系数。分区,即 nb。分区数等于 nb 的 2 到 4 倍。集群中的总 cpu 个核心。
关于线程,一个执行器 运行 中的 2 个任务并发应该不会有关于 multi-threading 的问题,因为每个任务都在处理自己的一组 RDD
。
如果设置了 spark.task.cpus = 2
,这意味着每个任务有 2 cpu 个核心,那么 IMO 可能存在竞争条件问题(如果有 var
),但通常我们是处理像 RDD
这样的不可变值,所以也应该只是有问题。