一个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 概念):

我说的对吗?关于第3种情况,是否会20考虑一个执行器内的多线程(即2个线程,因为有2个内核)?


更新1

如果第3种情况正确,则表示:

如果是这样,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 这样的不可变值,所以也应该只是有问题。