Java 一个执行器中有多少并发任务,Spark如何处理一个执行器中任务之间的多线程?
在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.task.cpus=1
,忽略vcore
概念):
- 10个执行器(2个内核/执行器),10个分区=>我认为一次并发任务的数量是10
- 10个执行器(2个内核/执行器),2个分区=>我认为一次并发任务的数量是2
- 10个执行器(2个内核/执行器),20个分区=>我认为一次并发任务的数量是20
- 10个执行器(1cores/executor),20个分区=>我认为一次并发任务的数量是10
更新1 如果第三种情况正确,则表示:
- 当执行器中的空闲内核可用时,Spark可以自动决定触发该执行器中的多线程
- 当执行器中只有一个内核时,多线程将不会在该执行器中发生
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。对于节点(假设每个节点有一个核心),这通常是没有意义的?考虑第四种情况。