任务中如何确定spark分区数task数目core个数worker节点个数excutor数量
Posted 打怪up
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了任务中如何确定spark分区数task数目core个数worker节点个数excutor数量相关的知识,希望对你有一定的参考价值。
1、任务中如何确定spark RDD分区数、task数目、core个数、worker节点个数、excutor数量
(1)hdfs 上的文件的存储形式是以 Block 的形式存储的,每个 File 文件都包含了很多块,一个Block默认是128M大小。当 spark 从 hdfs 上读取数据的时候,会根据具体数据格式对应的 InputFormat 进行解析,一般是将若干个Block合并成一个输入分片,称为 InputSplit,其中要注意InputSplit不能跨越文件 File。
(2)spark 会为这些分片生成具体的 task,InputSplit 与 Task 是一 一对应的关系,随后这些具体的 Task 每个都会被分配到集群上的某个节点的某个 Executor 去执行,每个 task 执行的结果就生成了RDD的一个 partiton。
- 每个 worker 节点可以起一个或多个 Executor。
- 每个 Executor 由若干 core 组成,每个 Executor 的每个 core 一次只能执行一个 Task。
- 每个 Task 执行的结果就是生成了目标 RDD 的一个 partiton。
注意: 这里的 core 是虚拟的 core 而不是机器的物理 CPU 核,可以理解为就是 Executor 的一个工作线程。
Task被执行的并发度 = Executor数目 * 每个Executor核数(=core总个数)
2、RDD 中 partition 的数目:
对于数据读入阶段,例如 sc.textFile,输入文件被划分为多少 InputSplit 就会需要多少初始 Task。
在 Map 阶段 partition 数目保持不变。
在 Reduce 阶段,RDD 的聚合会触发 shuffle 操作,聚合后的 RDD 的 partition 数目跟具体操作有关,例如 repartition 操作会聚合成指定分区数,还有一些算子是可配置的。
RDD 在计算的时候,每个分区都会起一个 task,所以 rdd 的分区数目决定了总的 task 数目。
申请的计算节点(Executor)数目和每个计算节点核数,决定了你同一时刻可以并行执行的 task。
例如:
RDD有100个分区,那么计算的时候就会生成100个task,你的资源配置为10个计算节点,每个2个核,同一时刻可以并行的task数目为20,计算这个RDD就需要5个轮次。
如果计算资源不变,你有101个task的话,就需要6个轮次,在最后一轮中,只有一个task在执行,其余核都在空转。
如果资源不变,你的RDD只有2个分区,那么同一时刻只有2个task运行,其余18个核空转,造成资源浪费。
参考博客:https://blog.csdn.net/weixin_38750084/article/details/82725176
以上是关于任务中如何确定spark分区数task数目core个数worker节点个数excutor数量的主要内容,如果未能解决你的问题,请参考以下文章
spark分区数,task数目,core数,worker节点个数,excutor数量梳理
spark:Task,Partition,RDD节点数Executor数core数目的关系和Application,Driver,Job,Task,Stage理解