SqlQueryExecution
① 将Statement树转化为AST树
② 做语法解析(根据元数据)
③ 权限校验
④ 构造逻辑执行计划
LogicalPlanner#planStatementWithoutOutput:将AST树转为逻辑执行计划
⑤ 基于RBO进行优化
⑥ Stage划分
⑦ 进行任务调度
SqlQueryScheduler#schedule:遍历当前Sql所解析的所有Stage
SourcePartitionedScheduler#assignSplits:为split分配Task
SplitPlacementPolicy#computeAssignments:为split分配Node
TaskInfoFetcher:负责从远端拉取数据
任务调度
-
遍历当前所有任务的Stage
SqlQueryScheduler#schedule:遍历当前Sql所解析的所有Stage
① 遍历所有Stage挨个进行调度
② 对调度结束的Stage,将其信息更新到依赖它的那些任务里,这样那些任务才知道从哪里进行数据的拉取 -
分发split给各个Worker节点上的Task
SourcePartitionedScheduler#assignSplits -
判断Sql所涉及的节点上是否存在Task
SqlStageExecution#scheduleSplits:如果该Worker节点有Task,更新splits
① 获取目标节点上所有的Task
SqlStageExecution@tasks 存储着每个Worker节点上负责的Task任务
② 如果目标节点上不存在Task,则调用 SqlStageExecution#scheduleTask
如果目标节点存在Task,则往SqlStageExecution@tasks中的目标Task中添加splitSqlStageExecution#scheduleTask:在Worker节点上新建Task
HttpRemoteTask#HttpRemoteTask
① 遍历所分配到该Task上的所有split
② 创建一个ContinuousTaskStatusFetcher对象定期拉取Worker上Task状态
创建一个TaskInfoFetcher对象定期拉取Worker上Task信息
③ 如果ContinuousTaskStatusFetcher是未完成状态,则更新该Task的split列表
如果状态是已完成,则执行释放资源的操作