apache drill 查询机制
内容来自 apache drill 学习手册
drill 的组件
- drill 客户端,链接到foreman ,提交sql,接受返回的结果
- forceman ,一个选择会话管理以及处理查询请求的drill 服务器,drill 的客户端会在drill 集群中随机选择一个driilbit 做为会话的foreman,不同会话会分配给不同的foreman
- driilbit 服务器,负责运行实际的查询
- zk 服务器,协调drill 集群中的driilbit 服务器
编译查询语句
drill sql 编译阶段的子阶段
- 解析sql,生成内部解析树
- 解析树进行语意分析,解析到数据源,字段、函数
- sql 解析树转换为逻辑计划(主要的流程图)
- 逻辑计划转换为物理计划,这一步实施一个基于执行开销的优化,找到最优方案
- 物理计划转换为执行计划,决定任务如何分配到drill 集群中的drillbit 服务器上
逻辑与物理计划
Major Fragment 书中翻译为了查询阶段,minor Fragment翻译为了查询切片,查询阶段是一个抽象概念,代表查询的一个执行阶段
每个查询阶段可以划分为一个或者多个查询切片,查询切片是真正的执行实体
drill 的所有算子组成了一颗树,根节点是屏幕算子(与drill 客户端交互),叶子节点都是负责吧数据读入drill 的扫描算子,所以每个查询阶段也都是
一颗树
数据会从叶子节点流向中间节点,并最终到达根节点(屏幕算子screen 术语),drill 使用上游表示数据源,也就是执行叶子节点的方向,下游是指
数据的目的地,也就是指向根节点的方向
分发
查询编译的最后一个步骤是把物理计划分发到执行节点,由于每个查询阶段都是单线程执行的,所以drill 是以查询阶段做为最小粒度进行任务分发的
查询语句执行
drill 查询计划分分类
- 查询计划返回用户(比如explan for)
- 在集群执行计划
foreman 的职责 - 等待执行计划(如果开启了准入控制)
- 查询切片发送到drillbit 去执行
- 监控执行过程,发现失败的任务
- 追踪查询切片执行,直到查询执行完成
- 当查询阶段执行完成后,结束查询,并输出查询分析报告
数据表达
drill 会将多行数据做为一个记录批出炉,每个记录行从几行到65536行,记录批是shuffle 时的最小交换单元,也是drill 客户端返回数据的最小单元
drill 使用了列式存储引擎
网络交换
drill 是基于内存处理的,drill 算子里处理数据所需的内存空间与drill 基于netty 的网络层所使用的内存空间是同一块,当然drill 也是会有shuffle 的尤其是在
如果内存放不下的时候,就需要基于文件处理了
说明
dremio 与apache drill 具有相似性,同时也包含了很大的不同,基于以上介绍,同时在结合dremio 源码学习压力就不会太大了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2020-03-11 postgresql_anonymizer 方便的数据脱敏扩展
2018-03-11 使用neon 开发nodejs addon
2017-03-11 Spring Cloud feign 服务超时处理