首页 > 其他 > 详细

Presto核心

时间:2020-12-22 22:10:43      阅读:29      评论:0      收藏:0      [点我收藏+]

SqlQueryExecution

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

疑问

  1. 是在哪里进行split进行分配的
    SplitPlacementPolicy#computeAssignments:为split分配Node
    NodeScheduler#selectDistributionNodes:开源实现,最简单的选择方式

Stage划分

入口:SqlQueryScheduler#createStages
核心:Stage划分的过程其实就是构造SqlStageExecution的过程

任务调度

  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列表
    如果状态是已完成,则执行释放资源的操作

Presto核心

原文:https://www.cnblogs.com/lin-/p/14174980.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!