Apache Drill:数据查询引擎概览

在当今的数据驱动世界中,数据工程师、分析师和商业智能(BI)专家经常需要分析、处理或查询不同的数据源。这通常涉及到开发大量的ETL(提取、转换、加载)作业,以及转换数据以确保数据在数据管道的下一步,如机器学习作业或报告工具中,能够以一致的结构可用。

Apache Drill简介

Apache Drill的灵感来自于Google的Dremel系统,该系统现在是Google Cloud Platform基础设施的一部分,并且更广为人知的名字是BigQuery。然而,Drill是Dremel的开源版本。它可以与各种数据库、云存储系统以及所有常见的Hadoop发行版一起使用,如Apache Hadoop、MapReduce、Cloudera和Amazon EMR。

查询引擎的需求

在当前时代,对于灵活的搜索引擎的需求并不罕见:数据科学家、工程师和BI分析师经常需要分析、处理或查询不同的数据源。这就需要开发大量的ETL作业,并转换数据以保证数据在数据管道的下一步,如机器学习作业或报告工具中,能够以一致的结构可用。

Apache Drill的功能

Apache Drill通过提供从各种源和系统查询数据的能力来解决这个问题,无需模式即可开箱即用。此外,它还提供了一个快速而强大的分布式执行引擎用于查询处理。它支持多个NoSQL数据库、文件系统和可以读取和操作的数据类型。下表显示了目前无需额外配置即可支持的内容。

对于任何其他数据源,Drill提供了创建所谓的存储模块的选项。这些可以被定义为描述新数据源的JSON文件。例如,Drill期望.csv文件用逗号分隔。如果现在有一个用分号分隔的文件,它可以很容易地在存储模块中被定义为.csv2文件。

Apache Drill的SQL查询示例

这意味着实际上不受数据类型的限制,并且可能编写一个查询,从HDFS检索一个.parquet文件,将其与hive表连接,并将其与来自MapR-DB的数据合并(如果公司使用所有这些技术):

SELECT customer_id AS c_id FROM dfs.`/var/inla/tables/customers` c --MapR-DB LEFT JOIN `hive.do.account ac --Hive table ON ac.customer_id = c.c_id UNION ALL SELECT d_customer_id FROM dfs.`/data/datahub/transactions` -- Parquet file

Apache Drill与JDBC/ODBC的支持

Drill支持JDBC/ODBC,因此它可以与任何常见的IDE(例如DBeaver)或BI/分析工具(例如PowerBI或Tableau)一起使用,这些工具使用这些驱动程序进行查询开发和数据可视化。

Apache Drill的概述

在前一节中,看到了Drill的一个巨大优势是它能够轻松处理不同类型的数据而不会产生太多开销。除了其灵活性之外,Drill还声称在安装和数据准备方面易于使用。没有必要在Drill可以处理数据之前加载和转换数据,或者创建和维护模式。用户可以在几乎任何系统中查询原始数据,无论类型如何。Drill将自行处理其余部分。

因此,它提供了一组标准的SQL函数用于查询数据。可以使用create和drop命令创建和删除表。使用replace命令对视图同样适用。Drill支持常规的表表达式,以帮助编写复杂的查询。还可以通过列对表进行分区,以使加载数据的子集更有效,并降低查询的成本。

Drill还提供了一些高级SQL功能,例如合并嵌套数据。因为它可以读取JSON等层次结构格式,它提供了一个合并函数,减少了嵌套数据结构的复杂性。使用flatten,可以将字段拆分为单独的行,这使得查询更容易,并将数据转换为更适合数据仓库结构的方式。

Apache Drill的局限性

不幸的是,在使用Drill时经常错过的一个缺点是Drill目前不支持插入、更新或删除行。这意味着没有直接编辑Drill已经处理过的数据的方式。每次想要更改持久的Drill表时,都必须完全删除表,并用更改过的数据重新创建它。特别是当使用Drill运行数据仓库时,每次新数据到达时重新创建每个表可能会非常昂贵。

查询执行

当客户端运行一个查询时,它被发送到Drillbits的Zookeeper集群。其中一个Drillbits接受查询,从而成为该特定查询的所谓工头。在整个后续过程中,这个Drillbit保持为主,并负责管理查询的执行。它首先使用基于Apache Calcite的内置SQL解析器解析查询来创建逻辑计划。然后查询被优化,产生最有效的执行计划。这个执行计划还考虑了数据在集群中的位置。因此,建议在集群的每个节点上都有Drillbit可用。

现在知道了Drill的功能以及它的构建和执行查询的方式,是时候讨论这些功能如何在现实世界场景中工作了。

让从Drill的最大特点开始:

正如上面提到的,Drill的巨大灵活性是有代价的。这不仅适用于一些SQL功能,还适用于数据源:Drill的巨大灵活性只适用于被查询的数据具有相同的结构特征。例如,如果查询一个包含多个JSON文件的目录,而这些文件并不都包含相同的层次结构,Drill无法推断这些文件的模式,并将无法读取它们。作为一种变通方法,将不得不从具有固定模式的JSON文件(例如parquets)创建数据类型,以便Drill查询数据,这使得Drill的全部优势变得无用。

对于在生产环境中使用Drill,了解如何解决问题尤为重要,当查询大数据时。Drill声称由于在集群中分布式查询执行而快速。然而,这只在为Drill提供足够的资源时才适用。主要问题是查询大量数据不会导致查询持续时间更长,而会导致根本无法执行这些查询。为了避免这种情况,请确保每个Drill都有足够的资源。Drill-on Yarn可以通过更改drill-on-yarn.conf文件中的参数轻松调整:

- 直接内存 - 堆内存 - 缓存

如果基本资源修改没有帮助,或者已经为特定任务使用了足够的内存,Drill仍然拒绝正确执行查询;只剩下一个选项——配置Drill。

除了上述要点之外,仍然有一些小错误,这就是为什么不建议在IT项目中使用Drill。例如,当合并表时,最近一个错误导致带有小数数据类型的列中出现了错误的数字。通过UNION,这些数字中的逗号被移位,导致错误的结果。但是,当构建数据仓库时,这种类型的错误是不可接受的。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485