当前位置: 首页 > news >正文

Presto 从提交SQL到获取结果 源码详解(3)

物理执行计划

回到SqlQueryExecution.startExecution() ,执行计划划分以后,

 // 初始化连接,获取Connect 元数据,添加会话,初始ConnectId

metadata.beginQuery(getSession(), plan.getConnectors());

// 构建物理执行计划

// plan distribution of query

planDistribution(plan);

//检测Query Split 情况及自身状态

// 创建OutputBuffers

createInitialEmptyOutputBuffers

// 创建调度器,内部通过 QueryStateMachine 存放调度状态,递归创建Stages

createSqlQueryScheduler

createStages()

createStreamingLinkedStages()

//提交调度任务至缓存

queryScheduler.set(scheduler);

// if query is not finished, start the scheduler, otherwise cancel it 开始执行
SqlQueryScheduler scheduler = queryScheduler.get();
if (!stateMachine.isDone()) {scheduler.start();
}

// 调度发起,生成并调度物理执行计划树

SqlQueryScheduler.schedule(Collection<SqlStageExecution> stages)

构造stage:

Fragment内部有Partition概念,根据 PartitionHandle类型,选择策略,确定split和task的调度方式
    PartitionHandle 分成两类
        一种是引擎Connector的分区策略
            例如:Hive查询遇到bucket表Scan操作,Presto会使用HivePartitioningHandle获取到具体bucket数量,依次来确认调度分区NodePartitionMap
        一种是Presto内置的分区策略
            在Connector不提供Handle情况下,默认初始化SystemPartitioningHandle,组装成PartitioningHandle
            例如:对于非Partition表,系统封装成SOURCE_DISTRIBUTION 读取。
    Partition 策略:
        SOURCE_DISTRIBUTION、SCALED_WRITER_DISTRIBUTION、SINGLE_DISTRIBUTION等

读取数据:
    有splitSource,非partition表:
        非桶表:分发执行
        桶表:根据桶数创建单独task
    有splitSource,bucket 表,RemoteSourceNode指向子Stage:
        if 子Stage的ExchangeType是replicate:
            上游数据复制到下游
        else:
            //即repartition 或 gather
            上游数据根据分区策略,交付给对应分区即可。
    没有splitSource的stage:
        不存在Split的调度,只存在Task的调度。

对于非bucket表,在planFragment 阶段Stage的partitioning就被定义为 SOURCE_DISTRIBUTION,意味着split均匀分配给所有节点,
        SOURCE_DISTRIBUTION 需逐个节点调度分配,检查当前机器是否存在task,创建并执行该split(优化:逐个节点调优于逐个split调度)


Split放置、分配策略:
    1.将所有可远程访问且没有地址信息的split进行worker分配。(所有Worker中,选择已调度split最小且总和小于机器单节点split的节点进行分发)
    2.未分配的split(split地址不可访问或所有节点均达到最大限制):
        2.1 地址不可访问:将split分配到自身的Ip地址上去
        2.2 可访问,尝试为该节点重新随机选择节点(不再考虑节点的worker上运行的split是否已经超过限制)/* 可能会抛出单节点split异常,负载过大*/

摘抄出处:Presto(Trino)分布式(物理)执行计划的生成和调度_presto fixedsourcepartitionedscheduler-CSDN博客

相关文章:

  • qt+ffmpeg 实现音视频播放(四)之音视频同步
  • k8s——Pod进阶(资源限制和探针)
  • 解决 Git commit 或 Git merge 跑到 VIM 里面去了
  • C#中的数组探索
  • C#面:.Net中会存在内存泄漏吗,请简单描述
  • python数据库操作
  • 校园导航系统C++
  • ReDos攻击浅析
  • 【揭秘】如何借助聚道云软件连接器,实现差旅管理新飞跃!
  • 神器!!Python热重载调试【送源码】
  • 【康耐视国产案例】智能AI相机机器视觉精准快速实现包裹标签的智能粘贴
  • 问题排查|记录一次基于mymuduo库开发的服务器错误排查(段错误--Segmentation fault (core dumped))
  • 虚拟现实环境下的远程教育和智能评估系统(一)
  • 头歌数据结构与算法课程设计中-硬币找零
  • vue项目中markdown显示为html
  • CSS居中完全指南——构建CSS居中决策树
  • eclipse的离线汉化
  • input实现文字超出省略号功能
  • js面向对象
  • OSS Web直传 (文件图片)
  • Python学习之路13-记分
  • Swoft 源码剖析 - 代码自动更新机制
  • XML已死 ?
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 程序员该如何有效的找工作?
  • 开源地图数据可视化库——mapnik
  • 前端代码风格自动化系列(二)之Commitlint
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 说说我为什么看好Spring Cloud Alibaba
  • ​TypeScript都不会用,也敢说会前端?
  • ‌[AI问答] Auto-sklearn‌ 与 scikit-learn 区别
  • #AngularJS#$sce.trustAsResourceUrl
  • #git 撤消对文件的更改
  • #大学#套接字
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (C#)获取字符编码的类
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (四)Linux Shell编程——输入输出重定向
  • (原创)可支持最大高度的NestedScrollView
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET 设计模式初探
  • .net 设置默认首页
  • .net 微服务 服务保护 自动重试 Polly
  • .Net--CLS,CTS,CLI,BCL,FCL
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • @NestedConfigurationProperty 注解用法
  • [ C++ ] STL---stack与queue
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname