Presto核心

SqlQueryExecution
① 将Statement树转化为AST树
② 做语法解析(根据元数据)
③ 权限校验
④ 构造逻辑执行计划
LogicalPlanner#planStatementWithoutOutput:将AST树转为逻辑执行计划
⑤ 基于RBO进行优化
⑥ Stage划分
⑦ 进行任务调度
SqlQueryScheduler#schedule:遍历当前Sql所解析的所有Stage
SourcePartitionedScheduler#assignSplits:为split分配Task
SplitPlacementPolicy#computeAssignments:为split分配Node
TaskInfoFetcher:负责从远端拉取数据

任务调度

  1. 遍历当前所有任务的Stage
    SqlQueryScheduler#schedule:遍历当前Sql所解析的所有Stage
    ① 遍历所有Stage挨个进行调度
    ② 对调度结束的Stage,将其信息更新到依赖它的那些任务里,这样那些任务才知道从哪里进行数据的拉取

  2. 分发split给各个Worker节点上的Task
    SourcePartitionedScheduler#assignSplits

  3. 判断Sql所涉及的节点上是否存在Task
    SqlStageExecution#scheduleSplits:如果该Worker节点有Task,更新splits
    ① 获取目标节点上所有的Task
    SqlStageExecution@tasks 存储着每个Worker节点上负责的Task任务
    ② 如果目标节点上不存在Task,则调用 SqlStageExecution#scheduleTask
    如果目标节点存在Task,则往SqlStageExecution@tasks中的目标Task中添加split

    SqlStageExecution#scheduleTask:在Worker节点上新建Task
    HttpRemoteTask#HttpRemoteTask
    ① 遍历所分配到该Task上的所有split
    ② 创建一个ContinuousTaskStatusFetcher对象定期拉取Worker上Task状态
    创建一个TaskInfoFetcher对象定期拉取Worker上Task信息
    ③ 如果ContinuousTaskStatusFetcher是未完成状态,则更新该Task的split列表
    如果状态是已完成,则执行释放资源的操作

上一篇:CSCI 1110:


下一篇:Focal Loss for Dense Object Detection(Retina Net)