分区索引-真正大表上的选择性查询

如何使您的选择性查询运行速度快100倍?

在本文中,我将解释如何解决> 10TB表上的选择性MPP(Impala,Presto,Drill等)查询,而无需执行全表扫描。

本文将以一种非常简单的方式描述所谓的"分区索引"的概念。 详细的体系结构和实现是整个新开源项目的主题。

问题

如果我们知道要过滤哪些列以及在该表上将要问什么样的问题,则分区是一种很好的优化方法。

但是有时候我们不知道在新型数据上最常见的BI问题是什么。 有时我们知道它们,但是列的值种类繁多,因此无法进行分区。

一个例子

假设我有1,000,000个事件驱动的传感器(它们每次发生某个特定事件时都会发送数据)。 每小时,我只有1000条记录流到Hive表中。 一年后,我将有一张非常大的桌子。

我的表按每小时DT(日期时间)进行分区。 当我想提出按时过滤的问题时,这会有所帮助。 但是,如果我想对过去一年从特定传感器获得的值进行一定的汇总,该怎么办?

我无法按传感器ID对表进行分区,因为我有1,000,000个传感器,这太多了。

如果我想使用Impala / Presto / Drill进行上述汇总-将进行全表扫描,这将非常昂贵,并且可能会失败,因为整个表(> 10TB)无法容纳在内存中 。

因此,您现在就遇到问题了,分析人员需要对非常大的表执行选择性查询,并且他们的查询会导致完全(或几乎完全)表扫描。

解决方案:分区索引

我们找到了解决该问题的简单方法。 我们创建了一个称为"分区索引"的文件。

分区索引-真正大表上的选择性查询

> Partition Index Illustration

什么是分区索引?

为了解释这个想法,我将再次使用传感器示例。 我们创建了一个数据集,该数据集基本上是一个字典,其关键字是传感器ID,值是该传感器ID出现的所有DT的列表。该数据集称为分区索引。

看起来像这样:

分区索引-真正大表上的选择性查询

当然,对于这种索引,有一个优化得多的模型,但是为了简化本文,我们将继续使用字典模型。

生成和维护索引

第一次创建该分区索引的过程非常繁琐,因为它必须处理表中的每条记录。 可以通过相对简单的Spark作业来完成。

完成此操作后,我们唯一需要记住的就是在将新分区添加到表中后,继续更新该分区索引。

哪种表需要分区索引?

分区索引适用于具有大量分区且表中值各不相同的表。

重要的是要注意,这并不是所有用例的解决方案。 例如,如果您的数据不是按DT分区的,或者如果不是,而是每个分区都包含所有ID(在我们的示例中为传感器ID),则该解决方案将无法工作。

使用分区索引

我们创建了一个简单的应用程序,该应用程序将分区索引保留在内存中,并且可以通过REST API进行查询。 服务启动时,分区索引将加载到内存中,以实现最佳性能。

因此,现在假设我有一个10TB的表,按DT分区,并且我想对过去一年中特定传感器的值进行汇总。 我首先用传感器ID查询分区索引,然后获取所有相关的DT。 现在,我在对这些DT进行过滤时执行Impala查询,而不是进行全表扫描,而是仅扫描相关的分区(数据的一部分),并以100倍的速度快速获得答案。

基础架构实施

我们发现分区索引确实有用,但是我们希望分析人员仅执行查询,甚至不知道分区索引存在。

因此,我们的实现是客户端和Impala守护程序之间的负载平衡器中的应用程序层,该应用程序层分析查询并生成使用分区索引的查询。

基本上,用户对负载均衡器执行查询:

SELECT avg(s.temperature) FROM sensors s WHERE s.sensor_id = 'f4c43b5f-b631–48b4-bf1b-22d174a6b6e4'

在负载平衡器中,我们添加了一个代码,该代码接受查询并检查是否:

· 它在具有分区索引的表上。

· 它按相关列(即sensor_id)进行过滤。

然后,它使用分区索引来生成并提交优化查询,并在where子句中使用相关分区:

SELECT avg(s.heat) FROM sensors s WHERE s.sensor_id = 'f4c43b5f-b631–48b4-bf1b-22d174a6b6e4' AND dt IN ('2018031201', '2018021614', '2017101005', …)

这样,分析师在大型表上进行选择性查询时的性能将提高100倍,而工作流程没有任何变化。

摘要

分区索引是客户端和MPP引擎之间的应用程序层中使用的组件,它通过仅读取相关分区来使选择性查询运行得更快。

这个想法可以以多种方式实现,但总体来说是一个非常简单的解决方案。 它不需要更改数据,这就是我喜欢的。

(本文翻译自Adir Mashiach的文章《Partition Index - Selective Queries On Really Big Tables》,参考:https://medium.com/@adirmashiach/partition-index-selective-queries-on-really-big-tables-795fea737570)


分享到:


相關文章: