梳理一下Spark中关于并发度涉及的几个概念File,Block,Split,Task,Partition,RDD以及节点数、Executor数、core数目的关系。
输入可能以多个文件的形式存储在 HDFS 上,每个 File 都包含了很多块,称为 Block。当 Spark 读取这些文件作为输入时,会根据具体数据格式对应的 InputFormat 进行解析,一般是将若干个 Block 合并成一个输入分片,称为 InputSplit,注意 InputSplit 不能跨越文件。随后将为这些输入分片生成具体的 Task。InputSplit 与 Task是一一对应的关系。随后这些具体的 Task 每个都会被分配到集群上的某个节点的某个 Executor 去执行。
- 每个节点可以起一个或多个 Executor。
- 每个 Executor 由若干 core 组成,每个 Executor 的每个 core 一次只能执行一个 Task 。
- 每个 Task 执行的结果就是生成了目标 RDD 的一个 partiton。
注意: 这里的 core 是虚拟的 core 而不是机器的物理 CPU 核,可以理解为就是 Executor 的一个工作线程。
而 Task 被执行的并发度 = Executor 数目 * 每个 Executor 核数。
至于 partition 的数目:
- 对于数据读入阶段,例如 sc.textFile,输入文件被划分为多少 InputSplit 就会需要多少初始 Task。
- 在 Map 阶段 partition 数目保持不变。
- 在 Reduce 阶段,RDD 的聚合会触发 shuffle 操作,聚合后的 RDD 的 partition 数目跟具体操作有关,例如 repartition 操作会聚合成指定分区数,还有一些算子是可配置的。
链接:https://www.zhihu.com/question/33270495/answer/93424104
来源:知乎