apache钻不好表现

时间:2016-09-19 22:27:02

标签: performance parquet apache-drill

我尝试使用apache-drill运行简单的join-aggregate查询,速度并不是很好。我的测试查询是:

SELECT p.Product_Category, SUM(f.sales)
FROM facts f
JOIN Product p on f.pkey = p.pkey
GROUP BY p.Product_Category

其中事实有大约422,000行,产品有600行。分组返回4行。

首先,我在SqlServer上测试了这个查询,并在大约150ms内得到了一个结果。

使用钻取我首先尝试直接连接到SqlServer并运行查询,但这很慢(大约5秒)。

然后我尝试将表保存到json文件中并从中读取,但这甚至更慢,所以我尝试了镶木地板文件。

我在第一次跑步中得到了结果,大约3秒钟。下次运行大约900ms,然后稳定在大约500ms。

从阅读开始,这没有任何意义,钻孔应该更快! 我试过“REFRESH TABLE METADATA”,但速度没有改变。

我是通过钻取命令行在Windows上运行它。

我是否需要一些额外的配置?

谢谢!

2 个答案:

答案 0 :(得分:6)

为什么期望Apache Drill在这里更快? Drill 非常快,但它专为大型分布式查询而设计,可能跨越多个不同的数据源......但您并未使用分布式数据。

SQL Server拥有数十年的代码和优化,使其成为在单个服务器上运行的最快的关系数据库之一。您的数据可以高效存储,缓存在内存中,查询可以在一个进程中运行,因此扫描和连接速度非常快,尤其是在数据量很少的情况下。

Apache Drill相比之下还有很多工作要做。它必须将您的查询解释为分布式计划,然后将其发送到所有钻取进程,然后查找数据源,使用连接器访问数据,运行查询,将结果返回到第一个节点进行聚合,然后你有最后的输出。根据数据源的不同,Drill可能必须读取所有数据并单独过滤,这会增加更多时间。

JSON文件很慢,因为它们是逐行解析的详细文本文件。 Parquet的速度要快得多,因为它是一种二进制压缩的面向列的存储格式,对扫描非常有效。

任何关系数据库都会比单机上的Drill更快。事实上,Drill让你获得500毫秒的Parquet结果,这实际上令人印象深刻,考虑到它需要做多少工作才能为你提供灵活性。如果你只有几百万行,坚持使用SQL服务器。如果您有数十亿行,则使用SQL Server列存储功能以柱状格式存储数据,并具有出色的压缩和性能。

在您执行以下操作时使用Apache Drill:

  • 拥有数十亿行或更多行(10)
  • 将数据分布在多台计算机上
  • 将非结构化数据(如JSON存储在没有标准架构的文件中)
  • 希望在多台计算机上拆分查询以将其并行化并更快地运行
  • 想要访问来自不同数据库和文件系统的数据
  • 想要跨这些不同的数据来源加入数据

答案 1 :(得分:2)

人们需要了解Drill如何工作的一件事是Drill如何将SQL查询转换为可执行计划,从理论上讲,从任何数据源获取和处理数据。我故意不说数据源,所以人们不会想到数据库或任何基于软件的数据管理系统。

Drill使用存储插件从存储插件支持的任何数据中读取记录。

Drill获取这些行后,它会开始执行执行查询所需的操作,所需的内容可能是过滤,排序,连接,投影(选择特定列)......等等

因此,默认情况下,钻取不使用任何源处理查询数据的功能。事实上,消息来源可能不支持这种能力!

如果您希望利用任何来源的数据处理功能,您必须修改您用来访问此来源的存储插件。

当我考虑Drill的表现时,我经常记得的一个问题就是这个问题

Select a.CUST_ID, (Select count(*) From SALES.CUSTOMERS where CUST_ID < a.CUST_ID) rowNum from SALES.CUSTOMERS a Order by CUST_ID

仅仅因为&gt; 比较运算符,Drill必须加载整个表格(即实际上是镶木地板文件),排序IT ,然后执行加入。< / p>

此查询在我的计算机上运行大约需要18分钟,这是一台功能不是很强大的计算机,但仍然不能忽略Drill处理此查询所需的工作。

Drill的目的不是快速,它的目的是处理大量数据并对结构化和半结构化数据运行SQL查询。可能还有其他我目前无法思考的事情,但您可以找到更多其他答案的信息。