Spark executor中task的数量与最大并发数

Spark executor中task的数量与最大并发数,第1张

关于executor和task的概念可以参考 官方文档

本文使用的源码是spark 2.0.0版本

根据类 DAGScheduler 中的 submitMissingTasks 方法可以知道,在stage中会为每个需要计算的partition生成一个task,换句话说也就是每个task处理一个partition。

当task被提交到executor之后,会根据executor可用的cpu核数,决定一个executor中最多同时运行多少个task。在类 TaskSchedulerImpl 的 resourceOfferSingleTaskSet 方法中, CPUS_PER_TASK 的定义为 val CPUS_PER_TASK = conf.getInt("spark.task.cpus", 1) ,也就是说默认情况下一个task对应cpu的一个核。如果一个executor可用cpu核数为8,那么一个executor中最多同是并发执行8个task;假如设置 spark.task.cpus 为2,那么同时就只能运行4个task。

在Yarn的NodeManager节点上启动一个map task或者reduce task,在物理上启动的是一个 jvm进程 ;而Spark的task是Executor进程中的一个 线程

并行度的解释:

并行度:是 一个spark应用中,每个stage之中的task的数目。

什么是task:

一个spark应用任务执行的最基本单位。

还有语义比较相近的配置参数:

在提交spark 应用的时候,会进行配置的参数

--num-execuotrs 应用启动的executor的数量

--executor-cores 每个executor之中core的数量。

可以将 core 看成是一个空位,task 看成是一个人,

这里的设置的意思就是,有两个executor 每个executor上面有 2个core,

表示每次可以坐四个人,也就是可以跑4个task。

那么问题来了:

1:如何设置并行度?

2:并行度的设置 在多少较为合适?

3:如果不设置并行度,那么并行度由谁来决定?

问题1:

在sparkConf之中进行并行度的配置

问题2:

并行度的设置一般在 core * executor * (2或者3之间)。

(executor的数量 乘上 core的数量 再乘上 2到3)

并行度不是越大越好,并行度太大的话,可能会造成任务空跑,这样就白白浪费了时间和资源。

问题3:

rdd之中的分区的数目,就会称为应用的并行度。

一个RDD之中的一个partition 对应一个task任务。RDD之中由多少个分区,

那么就会相应地生成多少个task。

一个小注意点:

这里的并行度的设置 是spark core 这个模块的。

对于spark sql 可能不起作用。

然后 executor的数量和core的数量 的设置,就是需要看具体的机器配置,以及愿意给这个任务多少资源去跑。

所以,并行度决定了task的数量,但是值得注意的就是,如果task的数目太多,

可能某个task之中并没有数据,task只是空跑。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/tougao/11320535.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存