简介
Apache Drill是一个引擎,可以连接到许多不同的数据源,并为它们提供SQL接口。 它不仅是遍历任何复杂事物SQL界面,而且是功能强大的界面, 其中包括对许多内置函数和窗口函数的支持。 尽管它可以连接到可以使用SQL进行查询的标准数据源(例如Oracle或MySQL),但它还可以处理诸如CSV或JSON等平面文件以及Avro和Parquet格式。
官方默认支持的数据源有hive、hbase、kafka、kudu、mongo、opentsdb、jdbc等,其中jdbc storage plugin可以覆盖所有支持jdbc协议的数据源,如:mysql、oracle等关系型数据库。所有数据源的接入都是通过drill的storage plugin实现的,理论上Drill通过storage plugin机制可以支持对任何数据源进行异构查询。
优势
1. 学习成本低
2. 低延迟的SQL查询
3. 动态查询自描述数据文件(json,text,Parquet),MPR-DB/Hbase表,不需要元数据定义的hive元数据。ANSI SQL
4. 嵌套数据支持
5. 与ApacheHive一体化(Hive表和视图的查询,支持所有的Hive文件格式和HiveUDFS)
6. BI/SQL工具集成使用标准的JDBC驱动程序
7. 访问多个数据源
8. 用户自定义UDF
9. 高性能(设计上高吞吐量和低延迟,不使用通用的执行引擎,柱形矢量引擎)
结构
Drill是一个无主节点的分布式查询工具,每一个部署节点(Drillbit)都包含有以下核心模块
RPC Endpoint: 基于RPC协议的客户端通信接口
SQL Parser: SQL解析工具,输出Logical plan, 它使用了开源工具:Calcite
Storage Engine interface: 面对多种数据源的统一读写抽象接口,它提供几种功能: 1.提供Metadata。 2.数据读写接口。3.数据定位和优化规则帮助提高查询效率。
查询过程
查询的流程常包括以下步骤:
1. drill客户端发起查询,客户端可以是一个JDBC、ODBC、命令行界面或REST API。集群中任何drill单元可以接受来自客户端的查询,没有主从概念。
2. drill单元对查询进行分析、优化,并针对快速高效执行生成一个最优的分布式执行计划。
3. 收到请求的drill单元成为该查询的drill单元驱动节点。这个节点从ZooKeeper获取整个集群可用的一个drill单元列表。驱动节点确定合适的节点来执行各种查询计划片段到达最大化数据局部性。
4. 各个节点查询片段执行计划按照它们的drill单元计划表执行。
5. 各个节点完成它们的执行后返回结果数据给驱动节点。
6. 驱动节点以流的形式将结果返回给客户端。