在spark中,一次并行执行多少个任务?在spark中,讨论如何将阶段划分为任务?dag是如何在rdd的掩护下工作的?
但我没有找到明确的结论。
考虑以下场景(假设 spark.task.cpus = 1
,然后忽略 vcore
简单概念):
10个执行器(2个核心/执行器),10个分区=>我认为一次并发任务的数量是10
10个执行器(2个核心/执行器),2个分区=>我认为一次并发任务的数量是2
10个执行器(2个核心/执行器),20个分区=>我认为一次并发任务的数量是20
10个执行器(1个核心/执行器),20个分区=>我认为一次并发任务的数量是10
我说的对吗?关于第三种情况,在一个执行器中考虑多线程(即2个线程,因为有2个内核)是20吗?
更新1
如果第三种情况是正确的,则表示:
当执行器中的空闲内核可用时,spark可以自动决定触发该执行器中的多线程
当执行器中只有一个内核时,多线程将不会在该执行器中发生。
如果这是真的,那么执行器中spark的行为不是有点不确定吗(单线程vs.多线程)?
请注意,从驱动程序发送到执行程序的代码可能没有考虑使用synchronized关键字等自动复制问题。
spark是如何处理的?
2条答案
按热度按时间a11xaf1n1#
我认为这4个案例都是正确的,而第4个案例在现实中是有意义的(“超额预订”核心)。对于nb,我们通常应考虑2到4的系数。隔板数量,即nb。分区数等于nb的2到4倍。群集中cpu核心总数的。
关于线程,并行运行的一个执行器中的两个任务不应该有关于多线程的问题,因为每个任务都处理自己的一组线程
RDD
.如果
spark.task.cpus = 2
设置,这意味着每个任务有2个cpu核,那么可能存在争用条件问题(如果有)var
),但通常我们处理的是不可变的值,如RDD
,所以也应该只有问题。njthzxwz2#
我想你是对的,这取决于你的执行者编号和内核,一个分区创建一个任务运行在一个内核上。