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

参考资料

https://drill.apache.org/docs/drill-query-execution/

posted on 2022-03-11 00:26  荣锋亮  阅读(285)  评论(0编辑  收藏  举报

导航