前言
当 sql 经过 planning 阶段后, 已经完成逻辑执行计划的生成和优化, 切分以及分散式计划的生成, 所有与逻辑执行计划相关的上下文已经基本完备, 后面就到了如何调度 sub plan 到各个 worker 上以及分发 split 到 task 的流程, 本文主要介绍 presto 是如何 schedule task 的?
上下文构建
开始调度前, 会先初始化各个相关对象, 生成整个 scheduling 的上下文环境. presto 调度的主类是 SqlQueryScheduler, 其内部会构建 SqlStageExecution, StageScheduler, StageLinkage 等对象辅助完成整个 task 和 split 的下发.初始化 SqlQueryScheduler 对象时, 会在遍历 stage plan 树的过程中, 递归调用 createStages 来创建 SqlStageExecution 对象, 每个 stage plan 都由一个 SqlStageExecution 负责调度其 task, split.
而在调用 createStages 创建 SqlStageExecution 时, 很重要的一步是计算出 NodePartitionMap 对象, 该对象包含了 splitToBucket, bucketToPartition, partitionToNode 三组映射关系, 与 task 和 split 的调度紧密相关.