Apache Drill 1.4性能增强的简要概述

今天,我们很高兴宣布Apache Drill 1.4现已在MapR发行版中可用。 钻1.4是MAPR生产就绪和支持的版本,可以从下载这里 ,找到1.4版本说明这里 。

Drill 1.4以其高度灵活和可扩展的体系结构为基础,带来了多种新功能以及对查询性能的增强,使其成为Drill社区非常重要的里程碑。

这是Drill 1.4中可用的关键功能/增强功能的列表。

  • 通过更快的限制0查询改善Tableau体验
  • Hive模式/表上的元数据(INFORMATION_SCHEMA)查询加速
  • 通过增强的分区修剪来优化查询计划和执行
  • 高效地缓存Parquet元数据,加快了对大量文件的查询
  • 改进的窗口功能,资源使用率和性能
  • 表功能
  • 改进的CSV标头解析
  • 新的和改进的MapR Drill JDBC驱动程序

在此博客文章中,我想专门简要概述一下最近的一些性能增强功能,即分区修剪和Parquet元数据缓存,这将使您能够在Drill部署中实现较低的延迟响应时间。 元数据缓存是Drill 1.2中新增的一项功能,自Drill 1.0以来就存在分区修剪功能,但在1.4版本中,这两项功能效率更高,并且涵盖了广泛的用例。

让我从一些背景开始。 Drill旨在在包含多种数据类型和数据源的大规模数据集上实现交互性能。 任何查询引擎中的性能均由两部分组成:

  1. 解析查询和创建最佳查询计划所花费的时间(又名查询计划时间)。
  2. 通过从底层存储系统中检索和处理数据来跨集群中的各个节点执行生成的查询计划所花费的时间(又称为查询执行时间)。

以下是在每个阶段中使Drill获得交互性能的一些核心Drill体系结构元素和技术的列表。 如您所见,分区修剪和元数据缓存都是作为查询计划一部分应用的优化技术的示例。

performanceenhancements-blog-img1

分区修剪

像Hadoop这样的大数据系统中的数据集大小可能是巨大的,范围从TB到PB。 在某些情况下,数据集可能从很小的开始,但是客户选择Hadoop是因为他们希望数据量显着且快速地增长。 分区修剪使查询引擎能够确定和检索所需的最小数据集来回答给定查询。 读取小数据意味着IO上的周期更少,而CPU上实际处理数据的周期也更少。 这是应用于传统DBMS / MPP系统中以实现性能的标准技术,但是由于大数据量,在大数据环境中变得更加重要。 为了利用分区修剪作为查询的一部分,需要根据您希望从用户那里获得的查询模式对数据进行适当地组织和分区。

组织数据可以在摄取时完成,或者随后通过使用各种Hadoop生态系统工具(例如Flume,Hive,Pig)或作为处理步骤完成,对于MapR,可以通过NFS直接摄取。 Drill支持使用各种类型的存储插件进行分区修剪。 在基于文件的目录结构查询文件系统时以及在查询Hive表时使用Hive Metastore表分区信息时,将应用分区修剪。 Drill本身提供了创建分区数据的功能,这是CREATE TABLE AS语法的一部分。

这是使用Drill SQL语法对数据进行分区的示例。 该语句将示例Yelp业务JSON数据集(可以从Yelp下载)转换为Parquet格式。 作为转换的一部分,数据还会根据州,城市和星号三列进行分区。

0: jdbc:drill:zk=local> create table dfs.tmp.businessparquet partition by (state,city,stars) as select state, city, stars, business_id, full_address, hours,name, review_count from `business.json`;

上面语句的输出是在与指定工作空间相对应的目录中生成的Parquet数据。 在这种情况下,dfs.tmp工作区指向文件系统上的/ tmp位置,并且生成的目录为/ tmp / businessparquet,这是SQL子句中指定的表名。

让我们获取CTAS命令生成的文件数。

NRentachintala-MAC:businessparquet nrentachintala$ cd /tmp/businessparquet/ NRentachintala-MAC:businessparquet nrentachintala$ ls -l |wc -l652

请注意,Drill CTAS命令生成的文件数量可以在Drill中使用各种参数进行调整。 但是,默认值匹配CTAS中指定的分区键列将具有的不同组合的数量。 例如,以下SQL语句为您提供了分区键列的不同组合数。

0: jdbc:drill:zk=local> select count(*) from (select distinct state, city, stars from dfs.yelp.`business.json`) ;
+---------+
| EXPR$0  |
+---------+
| 652     |
+---------+

现在已经对Parquet数据进行了分区,使用分区列(州,城市,星号)上的过滤器进行的查询可以利用分区修剪优化。 仅从磁盘读取相关数据,其余的分区在计划时修剪掉。

您可以通过在查询上运行EXPLAIN PLAN命令或从Drill Web UI(可以从Drillbit节点的8047端口启动)中查看配置文件,来轻松检查是否对给定查询应用了分区修剪。

让我们进行几个示例查询,看看是否使用Web UI进行了分区修剪。

这是一个在两个分区列(州和城市)上都带有过滤器的查询。

0: jdbc:drill:zk=local> select name, city, stars from dfs.tmp.businessparquet where state='AZ' and city = 'Fountain Hills' limit 5;+-----------------------------------------------+-----------------+--------+
|                     name                      |      city       | stars  |
+-----------------------------------------------+-----------------+--------+
| Fry's Food & Drug Stores                      | Fountain Hills  | 2.0    |
| Burger King                                   | Fountain Hills  | 2.0    |
| Francis & Sons Car Wash                       | Fountain Hills  | 2.0    |
| Kimmies                                       | Fountain Hills  | 2.0    |
| Le Baron Cleaners At Basha's Shopping Center  | Fountain Hills  | 3.5    |
+-----------------------------------------------+-----------------+--------+
5 rows selected (0.308 seconds)

在Web UI中,此查询的物理查询计划如下所示。 注意配置文件中突出显示的“ numFiles”值。 这表示从磁盘上读取了多少个文件以服务查询。 在这种情况下,将读取652个文件中的9个文件,因为查询对作为分区键的州和城市列都应用了过滤器,并修剪了剩余的数据分区。 检查读取的文件数是确保是否应用分区的一种简单方法。

00-00    Screen : rowType = RecordType(ANY name, ANY city, ANY stars): rowcount = 5.0, cumulative cost = {129.5 rows, 501.5 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 731
00-01      Project(name=[$0], city=[$1], stars=[$2]) : rowType = RecordType(ANY name, ANY city, ANY stars): rowcount = 5.0, cumulative cost = {129.0 rows, 501.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 730
00-02        SelectionVectorRemover : rowType = RecordType(ANY name, ANY city, ANY stars): rowcount = 5.0, cumulative cost = {129.0 rows, 501.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 729
00-03          Limit(fetch=[5]) : rowType = RecordType(ANY name, ANY city, ANY stars): rowcount = 5.0, cumulative cost = {124.0 rows, 496.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 728
00-04            Limit(fetch=[5]) : rowType = RecordType(ANY name, ANY city, ANY stars): rowcount = 5.0, cumulative cost = {119.0 rows, 476.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 727
00-05              Project(name=[$2], city=[$1], stars=[$3]) : rowType = RecordType(ANY name, ANY city, ANY stars): rowcount = 114.0, cumulative cost = {114.0 rows, 456.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 726
00-06                Project(state=[$1], city=[$2], name=[$0], stars=[$3]) : rowType = RecordType(ANY state, ANY city, ANY name, ANY stars): rowcount = 114.0, cumulative cost = {114.0 rows, 456.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 725
00-07                  Scan(groupscan=[ParquetGroupScan [entries=[ReadEntryWithPath [path=/tmp/businessparquet/0_0_111.parquet], ReadEntryWithPath [path=/tmp/businessparquet/0_0_114.parquet], ReadEntryWithPath [path=/tmp/businessparquet/0_0_115.parquet], ReadEntryWithPath [path=/tmp/businessparquet/0_0_110.parquet], ReadEntryWithPath [path=/tmp/businessparquet/0_0_109.parquet], ReadEntryWithPath [path=/tmp/businessparquet/0_0_113.parquet], ReadEntryWithPath [path=/tmp/businessparquet/0_0_116.parquet], ReadEntryWithPath [path=/tmp/businessparquet/0_0_117.parquet], ReadEntryWithPath [path=/tmp/businessparquet/0_0_112.parquet]], selectionRoot=file:/tmp/businessparquet, numFiles=9, usedMetadataFile=false, columns=[`state`, `city`, `name`, `stars`]]]) : rowType = RecordType(ANY name, ANY state, ANY city, ANY stars): rowcount = 114.0, cumulative cost = {114.0 rows, 456.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 724

现在,通过添加另一个带有stars列的过滤器来扩展上述查询,该过滤器也是一个分区键。

0: jdbc:drill:zk=local> select name, city, stars from dfs.tmp.businessparquet where state='AZ' and city = 'Fountain Hills' and stars= '3.5' limit 5;
+-----------------------------------------------+-----------------+--------+
|                     name                      |      city       | stars  |
+-----------------------------------------------+-----------------+--------+
| Le Baron Cleaners At Basha's Shopping Center  | Fountain Hills  | 3.5    |
| Euro Pizza Cafe                               | Fountain Hills  | 3.5    |
| Deluxe Nail & Spa                             | Fountain Hills  | 3.5    |
| Ha Ha China                                   | Fountain Hills  | 3.5    |
| Pony Express                                  | Fountain Hills  | 3.5    |
+-----------------------------------------------+-----------------+--------+
5 rows selected (0.342 seconds)

请注意,此查询的物理计划如下所示,“ numFiles”仅显示为1。因此,Drill必须读取652个文件中的1个才能回答查询。 查询中基于分区的过滤器越多,查询就可以指向数据的特定子集。 这可能会导致巨大的性能改进。 但是请注意,您的查询可能非常复杂,在这种情况下,从分区修剪中获得的性能优势可能无法与查询的处理成本相提并论。 但是,在大多数简单和中等查询中,这将是很大的帮助。 同样,利用分区修剪的最重要方面是弄清楚常见的查询模式并相应地对数据进行分区。 花一些时间来调整您的部署。

00-00    Screen : rowType = RecordType(ANY name, ANY city, ANY stars): rowcount = 5.0, cumulative cost = {40.5 rows, 145.5 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 1005
00-01      Project(name=[$0], city=[$1], stars=[$2]) : rowType = RecordType(ANY name, ANY city, ANY stars): rowcount = 5.0, cumulative cost = {40.0 rows, 145.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 1004
00-02        SelectionVectorRemover : rowType = RecordType(ANY name, ANY city, ANY stars): rowcount = 5.0, cumulative cost = {40.0 rows, 145.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 1003
00-03          Limit(fetch=[5]) : rowType = RecordType(ANY name, ANY city, ANY stars): rowcount = 5.0, cumulative cost = {35.0 rows, 140.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 1002
00-04            Project(name=[$3], city=[$1], stars=[$2]) : rowType = RecordType(ANY name, ANY city, ANY stars): rowcount = 30.0, cumulative cost = {30.0 rows, 120.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 1001
00-05              Project(state=[$1], city=[$2], stars=[$3], name=[$0]) : rowType = RecordType(ANY state, ANY city, ANY stars, ANY name): rowcount = 30.0, cumulative cost = {30.0 rows, 120.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 1000
00-06                Scan(groupscan=[ParquetGroupScan [entries=[ReadEntryWithPath [path=/tmp/businessparquet/0_0_114.parquet]], selectionRoot=file:/tmp/businessparquet, numFiles=1, usedMetadataFile=false, columns=[`state`, `city`, `stars`, `name`]]]) : rowType = RecordType(ANY name, ANY state, ANY city, ANY stars): rowcount = 30.0, cumulative cost = {30.0 rows, 120.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 999

Parquet元数据缓存

Hadoop部署的另一个共同特征是文件系统上的文件数量。 我们已经看到客户使用Drill查询成千上万的文件,用于报告和ETL用例。 Drill的与众不同的功能之一是它能够处理自描述数据格式(例如Parquet)并即时发现模式。 Parquet将有关数据的元数据存储为文件页脚的一部分,并且包含诸如列名,数据类型,可空性和其他列特性之类的信息,以及围绕数据布局的参数(例如行组大小)。 Drill将这些信息作为计划时间的一部分。 尽管Drill具有在查询时发现此元数据的能力,但是对于存在许多文件的用例来说,这可能是一项昂贵的操作。 从Drill 1.2开始,我们引入了在Drill中缓存Parquet元数据的功能。 缓存元数据后,可以根据需要刷新它,具体取决于数据集在环境中的更改频率。

以下是使用缓存元数据的命令。 该命令可用于文件夹或单个文件。

0: jdbc:drill:zk=local> REFRESH TABLE METADATA dfs.tmp.BusinessParquet;
+-------+-----------------------------------------------------------+
|  ok   |                          summary                          |
+-------+-----------------------------------------------------------+
| true  | Successfully updated metadata for table BusinessParquet.  |
+-------+-----------------------------------------------------------+
1 row selected (0.455 seconds)

Web UI或“解释计划”命令中的查询配置文件显示了给定查询是否利用了元数据缓存。

0: jdbc:drill:zk=local> select name, city, stars from dfs.tmp.businessparquet where state='AZ' and city = 'Fountain Hills' and stars= '3.5' limit 5;

请注意,以下配置文件中突出显示的“ usedMetadataCacheFile = true”表示此命令利用了元数据缓存。

00-00    Screen : rowType = RecordType(ANY name, ANY city, ANY stars): rowcount = 5.0, cumulative cost = {40.5 rows, 145.5 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 1279
00-01      Project(name=[$0], city=[$1], stars=[$2]) : rowType = RecordType(ANY name, ANY city, ANY stars): rowcount = 5.0, cumulative cost = {40.0 rows, 145.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 1278
00-02        SelectionVectorRemover : rowType = RecordType(ANY name, ANY city, ANY stars): rowcount = 5.0, cumulative cost = {40.0 rows, 145.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 1277
00-03          Limit(fetch=[5]) : rowType = RecordType(ANY name, ANY city, ANY stars): rowcount = 5.0, cumulative cost = {35.0 rows, 140.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 1276
00-04            Project(name=[$3], city=[$1], stars=[$2]) : rowType = RecordType(ANY name, ANY city, ANY stars): rowcount = 30.0, cumulative cost = {30.0 rows, 120.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 1275
00-05              Project(state=[$1], city=[$2], stars=[$3], name=[$0]) : rowType = RecordType(ANY state, ANY city, ANY stars, ANY name): rowcount = 30.0, cumulative cost = {30.0 rows, 120.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 1274
00-06                Scan(groupscan=[ParquetGroupScan [entries=[ReadEntryWithPath [path=/tmp/BusinessParquet/0_0_114.parquet]], selectionRoot=/tmp/BusinessParquet, numFiles=1, usedMetadataFile=true, columns=[`state`, `city`, `stars`, `name`]]]) : rowType = RecordType(ANY name, ANY state, ANY city, ANY stars): rowcount = 30.0, cumulative cost = {30.0 rows, 120.0 cpu, 0.0 io, 0.0 network, 0.0 memory}, id = 1273

分区修剪和元数据缓存的结合可以为各种查询带来巨大的性能提升,尤其是在临时查询/报告用例的情况下。 我们将在随后的博客文章中提供有关这些优化以及其他各种Drill性能功能和最佳实践的更深入的信息。

有关Drill 1.4功能的更多详细信息和文档,请参见MapR文档和Drill文档 。 祝贺Drill社区有了另一个重要的里程碑。 祝您钻Kong愉快!

这是您可以开始使用Drill的多种方法:

  • 在10分钟内在笔记本电脑上开始使用Drill
  • 将Drill与Hadoop结合使用-MapR沙箱和教程
  • 尝试使用Amazon Web Services进行钻取
  • 将Drill下载到您的MapR集群
  • 按需训练
  • 详细的分步教程

翻译自: https://www.javacodegeeks.com/2016/01/brief-overview-performance-enhancements-apache-drill-1-4.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【01背包】洛谷P1282多米诺骨牌

题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点。现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|。例如在图8-1中,S161119,S2153211,|S1-S2|2。每个多米诺骨牌…

java geolitecity_GeoLite2 Java根据IP获得城市、经纬度

之前我们介绍过通过 qqwry.dat 根据IP获得所属城市和运营商信息。但是这个 qqwry.dat 已经太久没更新了,数据有些不准确,而且现在我们有个需求就是想获取某个IP所在的经纬度。这里我们可以使用 GeoLite2,这个是国外开源的一个库,需…

计算机专业英语第二版张强华翻译_计算机语言发展的三个阶段,机器语言、汇编语言与高级语言...

在如今信息发达的时代,科技日新月异,计算机和Internet网络的发展也成为人们日常生活的重要部分。学习一两门计算机编程语言也如当初学习英文一样的火热,随着人工智能AI和云计算的不断发展,Python语言和Scala语言已经成为这两个领域…

使用Apache Drill REST API通过Node构建ASCII仪表板

Apache Drill有一个隐藏的瑰宝:易于使用的REST接口。 该API可用于查询,分析和配置Drill引擎。 在此博客文章中,我将说明如何使用Brilled Contrib使用Drill REST API创建ascii仪表板。 ASCII仪表盘如下所示: 先决条件 Node.js …

影子场vs.属性访问器接口第2轮

如果你们还没有注意到Dirk Lemmerman和我之间的(轻松) 对决 ,那么让我快速提及一下我们是如何做到这一点的。 首先,Dirk创建了JavaFX技巧23:“ 为属性保存内存阴影字段 ”,以帮助应用程序开发人员在使用Jav…

Lowest Common Ancestor of a Binary Search Tree a Binary Tree

235. Lowest Common Ancestor of a Binary Search Tree 题目链接:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/#/description 题目大意:给定一棵二叉查找树和两个节点p和q,要求返回这两个节点的第一个公共…

controller调用另一个controller中的方法 获取返回值_必须掌握!你知道 Spring 中运用的 9 种设计模式吗 ?...

Spring中涉及的设计模式总结,在面试中也会经常问道 Spring 中设计模式的问题。本文以实现方式、实质、实现原理的结构简单介绍 Sping 中应用的 9 种设计模型,具体详细的刨析会在后面的文章发布,话不多说,来个转发、在看、收藏三连…

我个人的CRUD故事-或我如何来到CUBA平台

在此博客文章中,我想介绍一下我如何使用CUBA平台以及此工具的好处。 在我年轻的“业务应用程序开发”历史上,我将深入探讨不同的阶段,只为您提供一些背景知识。 因此,让我们从如何进入典型的CRUD应用程序开始,以帮助非…

java 不定参数方法_java中不定长参数的使用方法

java中不定长参数的使用方法不定长参数方法的语法如下:返回值 方法名(参数类型...参数名称)在参数列表中使用“...”形式定义不定长参数,其实这个不定长参数a就是一个数组,编译器会将(int...a)这种形式看作是(int[] a)的形式。示例&#xff1…

光盘刻录只允许读取不能拷贝_原来 8 张图,就可以搞懂「零拷贝」了

作者 | 小林coding来源 | 小林coding(ID:CodingLin)前言磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝、直接 I/O、异步 I/O 等等,这些优化的目的就是…

纯java分布式内存数据库_最新Java岗面试清单:分布式+Dubbo+线程+Redis+数据库+JVM+并发...

最近可能有点闲的慌,没事就去找面试面经,整理了一波面试题。我大概是分成了Java基础、中级、高级,分布式,Spring架构,多线程,网络,MySQL,Redis缓存,JVM相关,调…

c++ 多核cpu序列号_详解CPU几个重点基础知识

作者 | 骏马金龙责编 | 阿秃关于CPU和程序的执行1、程序的运行过程,实际上是程序涉及到的、未涉及到的一大堆的指令的执行过程。当程序要执行的部分被装载到内存后,CPU要从内存中取出指令,然后指令解码(以便知道类型和操作数,简单…

java log4j 写日志_Java log4j同时写入文本日志和数据库日志

版权声明:转载原创文章请以超链接形式请注明原文章出处,尊重作者,尊重原创!恰饭广告Log4jUtil.javaimport org.apache.log4j.Logger;import org.apache.log4j.MDC;public class Log4jUtil {private static Logger logger Logger.…

订单生产计划表范本_工厂生产管理为什么需要ERP软件?

对于工厂来说,规模大了,管理问题也就随之多了,在工厂生产流程中,我们常见的一些生产现象,比如生产计划表徒具形式、各生产部门半成品堆积、生产计划达标率低、前后工序原材料或半成品衔接不上、经常追加或取消生产计划…

P1266 速度限制

速度限制 洛谷链接 题目大意: 在一个城市中,每条道路有限速和长度,通过一条道路的时间为这条道路的长度除以限制的速度,有的道路不知道限速为多少,那么就按现在的速度走这条路,找出从第一个点到目标点的最短…

mysql递归查询所有上下节点_非递归打印二叉树的所有路径,保存父节点和孩子节点到底有啥差别...

题目解读题目要求输出二叉树的所有路径(字符串形式),乍一看很简单,不就是二叉树的遍历嘛!其实不然,首先,我们用非递归的方式(C)解决这道题(递归在产品代码中是不允许使用的,其次定位 bug 的时候非常困难)。…

发现大量Java原语集合处理

在阅读博客文章5减少Java垃圾收集开销的技巧时 ,我想起了一个名为Trove的小型Java收集库,该库“为Java提供了高速的常规和原始收集”。 我对应用Trove允许原始类型的集合而不是要求集合中的元素成为完整的引用对象的能力特别感兴趣。 我在这篇文章中会更…

nginx配置多个server_Nginx基本属性配置详解

. Nginx服务的基本配置1.1 用于调试进程和定位问题的配置项是否以守护进程的方式运行nginx# 默认ondaemon on|off;是否以master/worker方式工作# 默认on,指定了是否以master-worker进程的方式运行,如果设置为off,那么所有的请求将只会由maste…

数据增长率怎么算_20年老股民告诉你5个数据可轻松算出股价是否高估

自从开通自媒体以来,有很多朋友问我该如何正确判断股票的合理价格呢?说得太专业,可能很多新入市的股民朋友看不懂。那有没有一种估值方法通俗易懂呢?说实话,真有点为难我了。我首先想到了最简单的PE估值法,…

ad 单点登录 java 访问权限_AD 单点登录以及windows认证详细说明

上篇博客我谈到了一些关于ASP.NET Forms身份认证方面的话题,这次的博客将主要介绍ASP.NET Windows身份认证。Forms身份认证虽然使用广泛,不过,如果是在 Windows Active Directory 的环境中使用ASP.NET, 那么使用Windows身份认证也…