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 源码学习压力就不会太大了