Java 一个执行器中有多少并发任务,Spark如何处理一个执行器中任务之间的多线程?

Java 一个执行器中有多少并发任务,Spark如何处理一个执行器中任务之间的多线程?,java,multithreading,apache-spark,concurrency,yarn,Java,Multithreading,Apache Spark,Concurrency,Yarn,在Spark中,一次并行执行多少任务?讨论内容见 和 但我没有找到明确的结论 考虑以下场景(为了简单起见,假设spark.task.cpus=1,忽略vcore概念): 10个执行器(2个内核/执行器),10个分区=>我认为一次并发任务的数量是10 10个执行器(2个内核/执行器),2个分区=>我认为一次并发任务的数量是2 10个执行器(2个内核/执行器),20个分区=>我认为一次并发任务的数量是20 10个执行器(1cores/executor),20个分区=>我认为一次并发任务的数量是1

在Spark中,一次并行执行多少任务?讨论内容见 和

但我没有找到明确的结论

考虑以下场景(为了简单起见,假设
spark.task.cpus=1
,忽略
vcore
概念):

  • 10个执行器(2个内核/执行器),10个分区=>我认为一次并发任务的数量是10
  • 10个执行器(2个内核/执行器),2个分区=>我认为一次并发任务的数量是2
  • 10个执行器(2个内核/执行器),20个分区=>我认为一次并发任务的数量是20
  • 10个执行器(1cores/executor),20个分区=>我认为一次并发任务的数量是10
我说得对吗?关于第三种情况,在一个执行器内考虑多线程(即2个线程,因为有2个内核)是否为20


更新1

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

  • 当执行器中的空闲内核可用时,Spark可以自动决定触发该执行器中的多线程
  • 当执行器中只有一个内核时,多线程将不会在该执行器中发生
如果这是真的,那么执行器中Spark的行为是否有点不确定(单线程vs.s.多线程)

请注意,从驱动程序发送到执行程序的代码可能没有考虑使用例如synchronized关键字的自动兼容性问题


Spark是如何处理的?

我认为您是对的,这取决于您的执行器编号和内核,一个分区创建一个在一个内核上运行的任务。

我认为所有4种情况都是正确的,第4种情况在现实中是有意义的(“超额预订”内核)。我们通常应该考虑到NB的2到4的因素。分区的数量,即nb。分区的数量等于nb的2到4倍。群集中cpu核心总数的

关于线程,同时运行的一个执行器中的两个任务不应该有关于多线程的问题,因为每个任务都在处理自己的
RDD


如果设置了
spark.task.cpus=2
,这意味着每个任务有2个cpu核,那么可能存在争用条件问题(如果存在
var
),但通常我们处理的是不可变值,如
RDD
,因此应该只有这两个问题。

您是正确的(包括第三种情况)。另一个需要考虑的因素是VCARC。在Hortonworks/Cloudera上,管理员可以选择将单个物理核心拆分为一组虚拟核心。每个虚拟核心都能够在分区上执行任务。适用于大多数常见情况。然而,有一个
spark.task.cpu
设置可以改变这一点@马扎尼查感谢您的评论。但是我认为,
spark.task.cpu
是关于nb的。每个任务的CPU数量,而我的问题是关于nb。任务,这是不同的,但您的链接也很有趣如果您为每个任务分配2个CPU,那么具有4个内核的执行器将只能同时运行2个任务,而通常它将运行4个。@mazaneicha有道理,我将在问题中提出假设
spark.task.cpus=1
。但是在这里,您讨论的是一个任务内部的多线程处理(一个任务有两个线程),问题更多的是任务之间的多线程处理(一个任务有一个线程,但两个任务在一个执行器中并发运行),谢谢。这是否意味着,如果nb。分区的数量大于nb。对于节点(假设每个节点有一个核心),这通常是没有意义的?考虑第四种情况。