Apache Kylin查詢效能優化

2021-09-29 04:48:49 字數 3280 閱讀 4598

apache kylin™是乙個開源的分布式分析引擎,提供hadoop之上的sql查詢介面及多維分析(olap)能力以支援超大規模資料,最初由ebay inc. 開發並貢獻至開源社群,可在亞秒內查詢巨大的hive表。

在apache kylin的實際部署過程中,sql查詢有時並不能如預期在很短的時間內完成,需要開發人員進行有針對性的分析和優化。

在進行分析、優化之前,我們需要先了解apache kylin查詢的整個生命週期。這一週期主要分為三個階段:第一階段的sql解析階段,第二階段的sql查詢階段,以及第三階段的資料集中和聚合階段。接下來,我們將分階段為大家解析應如何分析和優化apache kylin的查詢效能。

在收到sql請求後,kylin query server會呼叫calcite對sql語句進行解析,calcite的工作流程如下圖。

首先,calcite會將sql語句通過正規化編譯器解析為一顆抽象語義樹(ast)。

然後calcite對這棵ast樹進行優化,將project(select部分)和filter(where部分)push down至hadoop集群。

接著定義implement plan,共有兩種方式:hepplanner(啟發式優化)和volcanoplanner(基於代價的優化)。目前kylin只啟用了一些必要的hepplanner規則,大部分使用的是volcanoplanner。

針對子查詢,union等場景,calcite將sql分解為多個olapcontext,同時執行filter pushdown和limit pushdown等優化手段,然後提交到hbase上執行。

hbase上的查詢任務執行完成後,資料返回至kylin query server端,由calcite聚合多個olap context的查詢結果後,最後返回給前端bi。在了解apache kylin的查詢生命週期以後,碰到一些查詢速度較慢的情況,就能夠有針對性地進行分析和優化了。

1、從模型設計角度,需要合理調整rowkey中維度的排列順序,原則是把過濾字段(例如part_dt等日期型字段)和高基維(例如buyer_id,seller_id等客戶字段)放在rowkey的前列,這樣能夠顯著提公升【第二階段sql查詢】在hbase上資料掃瞄和i/o讀取的效率。

2、kylin遵循的是「scatter and gather」模式,而有的時候在【第二階段sql查詢】時無法實現filter pushdown和limit pushdown等優化手段,需要等待資料集中返回kylin後再篩選資料,這樣資料吞吐量會很大,影響查詢效能。優化方法是重寫sql語句。

例如,該sql查詢的篩選條件(斜體加粗部分)放在子查詢中,因此無法實現filter pushdown。

select kylin_sales.part_dt, sum(kylin_sales.price)

from kylin_sales

inner join (select account_id, account_buyer_level from kylin_account whereaccount_country = 'us' ) as tt

on kylin_sales.buyer_id = tt.account_id

group by kylin_sales.part_dt

正確的寫法應該是:

select kylin_sales.part_dt, sum(kylin_sales.price)

from kylin_sales

inner join kylin_account as tt on kylin_sales.buyer_id = tt.account_id

where tt.account_country = 'us'

group by kylin_sales.part_dt

如下圖所示,可以在日誌中檢視filter pushdown是否成功。

3、檢視後台日誌,如果查詢擊中了base cuboid,則【第三階段資料集中和聚合】將會花費大量時間,優化方法是調整模型中聚合組,聯合維度,必要維度的設計。

apache kylin高階設定:聚合組(aggregation group)原理解析

apache kylin高階設定:聯合維度(joint dimension)原理解析

apache kylin高階設定:必要維度 (mandatory dimension)原理解析

在日誌中可以看到查詢擊中的cuboid組合,如下圖紅框中的131071,將其轉換為二進位制數值是0x1 1111 1111 1111 1111,從右至左,共有17個1,表示該cuboid中包含了17個維度(這裡從右至左指代的維度的對應順序是cube模型中rowkey中自下而上定義的維度),而cube模型中所有維度的數量是17,說明擊中了base cuboid。

4、從kylin query server處理效率角度,需要實時監控kylin節點的cpu占有率和記憶體消耗,如果兩者很高的話可能導致【第一階段sql解析】的效率下降,優化方法是增加kylin節點cpu和jvm配置。

具體方法是修改setenv.sh中的kylin_jvm_settings配置項。

5、監控bi前端,kylin query server節點和hadoop集群之間的網路通訊狀態,大資料集傳輸可能引起網路堵塞,尤其是在多併發查詢的情況下更容易發生網路堵塞,進而對查詢效能產生顯著影響。優化方法是確保bi前端、kylin節點、hadoop集群之間的網路通暢,乙個簡單的方法是用ping命令檢視網路之間的延遲。

6、對於一些複雜的sql語句,如果包含子查詢的話,盡量避免left join操作,尤其是join的兩個資料集都較大的情況下,會對查詢效能有顯著的影響。建議將sql的資料處理邏輯放在etl階段,而前端sql邏輯保持簡單明瞭。

APACHE KYLIN簡單介紹

apache kylin 概覽 apache kylin 是乙個開源的分布式分析引擎,提供hadoop之上的sql查詢介面及多維分析 olap 能力以支援超大規模資料,最初由ebay inc.開發並貢獻至開源社群。它能在亞秒內查詢巨大的hive表。kylin是什麼?可擴充套件超快olap引擎 kyl...

Apache Kylin使用總結

apache kylin是一款以預處理cube來提高查詢速度的olap引擎。首先對維度表做個簡單的介紹。麒麟只支援星型模型,也就是說乙個事實表加上多個維度表。維度表不存在支架型結構。維度表存放的大多是描述性字段,用於篩選。其實以sql的角度來看就是group by filter through wh...

Apache Kylin集群部署

筆者所在的公司,目前打算在測試 生產環境上面部署apache kylin集群,注意以下幾點 1 kylin.server.mode all,job,query 這個決定了當前kylin節點所擔任的角色,乙個kylin集群只能有一台作業引擎,也即只能有一台節點的這個配置專案為all或者job 可以有多...