功夫熊猫 2019-06-20
目录
Architecture Introduction
Drill Query Execution
Core Modules
Performance
Apache钻是一个低延迟查询大规模数据集分布式引擎,包括结构化和半结构化/嵌套数据。灵感来自于 谷歌的Dremel,drill被设计服务于几千个节点,交互速度查询PB数据BI/分析环境要求。
在对大规模的数据集对短的,交互式的特殊查询钻也非常有用。钻能够查询像JSON和Parquet数据格式的嵌套数据以及执行动态模式的发现。钻不需要一个集中的元数据存储库。
高级体系结构
drill包括分布式执行环境,建造目的是进行大规模数据处理。Apache钻的核心是“Drillbit”服务,负责接受来自客户端的请求,处理查询,并返回结果给客户端。
Drillbit服务可以安装和运行在Hadoop集群所需的所有节点形成分布式集群环境。当一个Drillbit运行在集群中的每个数据节点,钻可以最大化数据位置,在查询执行期间无需通过网络或节点移动数据。钻使用ZooKeeper来维护集群成员和信息的健康检查。
尽管钻在Hadoop集群环境中工作,钻不绑定Hadoop也可以在任何分布式集群环境运行。Zookeeper是钻的唯一先决条件。
Drill 用户
你可以通过以下接口访问钻:
C++ API
$ cd $WORK $ . ./init.sh $ ./drill/apache-drill/bin/sqlline -u jdbc:drill:zk=local Drill log directory /var/log/drill does not exist or is not writable, defaulting to ... Apr 06, 2015 12:47:30 AM org.glassfish.jersey.server.ApplicationHandler initialize INFO: Initiating Jersey application, version Jersey: 2.8 2014-04-29 01:25:26... sqlline version 1.1.6 0: jdbc:drill:zk=local>
动态模式发现
钻不要求数据模式或规范数据类型按顺序开始查询执行过程。Drill在批记录开始数据处理,在处理过程中发现模式。自描述数据格式如Parquet、JSON、AVRO,NoSQL数据库有指定的模式作为数据自身的一部分,钻动态地实时查询。因为模式一改变就会结束Drill查询进程,钻的许多运算符被设计成当模式改变就重新配置自身。
灵活的数据模型
钻允许访问嵌套数据属性,就像SQL列和提供了直观的扩展很容易操作。从体系结构的角度来看,钻提供了一个灵活的柱状分层的数据模型,可以表示复杂,高度动态和不断演化的数据模型。在钻中关系数据被视为一个特殊的或简化的复杂/多结构化的数据。
没有集中的元数据
钻没有一个集中的元数据的要求。你不需要创建和管理元数据存储库中的表和视图,或依赖数据库管理员组的一个函数。钻导出元数据通过存储插件对应的数据源。存储插件提供完整元数据范围的排列从元数据(hive),局部元数据(HBase),或没有中央元数据(文件)。分散式的元数据意味着钻不绑定到单一的Hive库。您可以一次查询多个hive存储库,然后从HBase表或文件在一个分布式文件系统用信息合并数据。你也可以使用SQL DDL语句用钻创建元数据,该组织像一个传统的数据库。钻元数据是通过ANSI标准INFORMATION_SCHEMA数据库来访问的。
可扩展性
所有层的钻在所有层提供了一个可扩展的体系结构,包括存储插件,查询,查询优化/执行和客户端API层。你可以为组织的具体需求定制任何层也可以扩展层到更广泛的数组用例。钻使用类路径扫描查找并加载插件,用最低限度的配置添加额外的存储插件、函数和运算符。
当你提交一个钻查询,一个客户或一个应用程序在Drill集群发送SQL语句的形式查询给Drillbit。 Drillbit是进程运行在每个活动节点坐标、计划、并执行查询,以及跨集群分发查询工作最大化数据所在位置。
下图表示客户之间的通信、应用程序、和Drillbits:
Drillbit从客户或应用程序接收查询变成了工头驱动整个查询。SQL工头部分的解析器解析,将自定义规则应用到特定的SQL操作转化为一个特定钻understands的逻辑运算符语法。这个逻辑运算符集合形成逻辑计划。 生成所需的逻辑工作计划描述了查询结果并定义数据源和应用操作。
工头发送逻辑计划到一个基于成本的优化器优化SQL操作的顺序在一份声明中,读逻辑计划。 优化器适用于各种类型的规则重新运算符和函数为最优方案。 优化器将逻辑计划转换为一个具体的计划,描述如何执行查询。
工头的并行化变换的物理计划为多个阶段,主要和次要的碎片。 这些片段创建一个多层次执行重写查询的树,根据配置的数据源,并行执行它发送回客户机或应用程序的结果。
主要的片段
主要的片段是一个概念,表示查询执行的一个阶段。 一个阶段可以包含一个或多个操作,钻机必须执行执行查询。 钻MajorFragmentID分配每个主要片段。
例如,执行散列集合的两个文件,钻可能创建一个计划,有两个主要阶段(主要碎片)第一阶段致力于扫描这两个文件和第二阶段致力于聚合数据。
钻机使用单独的主要碎片的交易所运营商。 数据交换是一个变化的位置和/或并行物理计划。 交换是由允许数据的发送方和接收方之间的移动节点。
主要碎片并不执行任何查询任务。 每个主要片段划分为一个或多个小片段(在下一节中讨论),实际执行所需的操作来完成查询并返回结果返回给客户端。
你可以与主要碎片在物理计划通过捕获的JSON表示计划在一个文件中,手动修改,然后提交回钻使用提交计划命令。 您还可以查看查询的主要碎片,可见在钻Web控制台。 看到 说明 和 查询配置文件 为更多的信息。
小碎片
每个主要片段并行成小碎片。 一个小片段是一个逻辑工作单元内运行的线程。 一个逻辑工作单元在钻也称为一片。 钻产生的执行计划是由小碎片。 钻MinorFragmentID分配每个小片段。
工头的并行化创建一个或多个小片段片段在执行时,一个主要片段分解成许多小碎片,因为它能有效地同时运行在集群上。
钻每个小片段在它自己的线程执行尽快根据其上游数据需求。 钻机计划节点与数据局部性的小片段。 否则,钻安排他们在现有的循环方式,Drillbits可用。
小片段包含一个或多个关系运算符。 操作员执行关系操作,如扫描,过滤器,加入,或组。 每个运营商都有一个特定的运营商类型和一个OperatorID。 每个OperatorID定义的关系在它所属的小片段。 看到 物理运算符 。
例如,当执行散列集合的两个文件,钻了第一阶段致力于扫描成两个小片段。 每个小片段包含扫描操作符扫描这些文件。 钻了第二阶段致力于聚合成四个小碎片。 的四个小片段包含执行哈希散列总运营商聚合操作数据。
您不能修改执行计划中的小片段的数量。 然而,您可以查看在钻Web控制台的查询和修改一些配置选项,改变小片段的行为,如片的最大数量。 看到 配置选项 。
执行的小片段
小碎片可以作为根用户运行,中间或叶碎片。 一个执行树只包含一个根片段。 执行树的坐标屈指可数的根,根是零。 数据流从叶片段下游根片段。
根片段在工头和接收传入的查询运行,读取元数据表,重写查询和路线服务树中的下一个阶段。 另一个片段成为中间或叶片段。
中间片段开始工作当数据或从其他碎片喂它们。 他们对数据执行操作,然后下游发送数据。 他们还通过聚合根片段,结果执行进一步聚合和为客户提供查询结果或应用程序。
叶子碎片并行扫描表和交流或访问本地磁盘上的数据存储层。 叶碎片部分结果传递给中间片段,对中间结果进行并行操作。
钻只有计划查询并发运行片段。 例如,如果20片存在集群中的可用,演习计划查询运行不超过20小片段在一个特定的主要片段。 钻是乐观,认为它可以并行完成的所有工作。 所有主要小片段为特定片段开始同时根据上游数据依赖。
←架构介绍 核心模块→