任务中如何确定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

猜你喜欢

转载自www.cnblogs.com/guoyu1/p/12299170.html
今日推荐