Spark任务跨核心分配机制及核心-任务-分区映射疑问
Spark任务调度与分区核心问题解答
原书引用
每个stage由Spark task(执行单元)组成,这些task会分配到各个Spark executor上;每个task对应一个核心,处理单个数据分区(图2-5)。因此,拥有16个核心的executor可并行处理16个或更多task,对应16个或更多分区,使Spark任务的执行具备极高的并行度!
Damji, Jules S.; Wenig, Brooke; Das, Tathagata; Lee, Denny. Learning Spark (p. 59). O'Reilly Media.
问题1:16核executor如何实现16个以上任务并行
你提到的I/O繁忙时的时间分片、超线程是原因之一,但更核心的逻辑是Spark的任务队列调度机制:
- 16个核心是同一时刻能跑的物理并行任务上限,但每个核心都会挂一个任务队列。当某个核心上的task处理完一个分区后,会立刻从队列里取下一个task执行。从宏观时间维度看,这个executor在一段周期内可以处理远多于16个的task,只是同一时刻最多16个在物理并行。
- 另外,CPU超线程技术能让单个物理核心同时处理多个逻辑任务,当某个逻辑任务卡在I/O(比如读取外部存储)时,另一个逻辑任务可以利用核心的空闲周期运行,这也能让实际并行的逻辑任务数超过物理核心数。
问题2:核心/Task与分区的映射及分区数量、Shuffle相关问题
- 核心/Task与分区的1:1是物理并行时的映射:同一时刻每个核心跑一个task、每个task处理一个分区,但这并不限制整个stage的分区总数。16核executor完全可以存在超过16个分区——这些分区会进入任务队列,等待核心空闲后依次执行。
- Shuffle的触发与数据处理逻辑:当任务需要访问其他分区的数据时(比如join、groupByKey这类操作),确实会触发Shuffle。Shuffle是重新组织数据分区的过程:Spark会把需要同组处理的数据拉到同一个节点/executor,生成新的分区,后续的task会处理这些新分区——每个task依然只处理一个分区,但这个分区的内容是Shuffle后重新整理的结果,而非修改原分区内容。
内容的提问来源于stack exchange,提问作者Devdatta
相关产品推荐
相关产品推荐

