分區索引-真正大表上的選擇性查詢

如何使您的選擇性查詢運行速度快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)


分享到:


相關文章: