快手BI大數(shù)據(jù)分析場(chǎng)景性能優(yōu)化實(shí)踐
一、快手分析產(chǎn)品介紹
KwaiBI 產(chǎn)品是當(dāng)前快手內(nèi)部使用的數(shù)據(jù)分析產(chǎn)品,平臺(tái)愿景是:致力于通過(guò)豐富分析工具產(chǎn)品,打造一站式的數(shù)據(jù)分析平臺(tái),提升數(shù)據(jù)獲取與分析效率。KwaiBI 目前月活達(dá)到 1.5W,支持 5W 以上的報(bào)表數(shù),10W 以上的模型,接入 150 多個(gè)大大小小的業(yè)務(wù)。
KwaiBI 提供 5 種數(shù)據(jù)消費(fèi)場(chǎng)景,取數(shù)、多維分析、可視化、推送、門戶。其中主要的分析場(chǎng)景是多維分析和可視化。
1. 快手分析平臺(tái)的分析能力介紹
快手分析平臺(tái)底層對(duì)接多種數(shù)據(jù)源,包括大數(shù)據(jù)存儲(chǔ)各種引擎、傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù),也支持一些本地文件的數(shù)據(jù)分析。
在使用 KwaiBI 分析平臺(tái)做數(shù)據(jù)分析之前,用戶需要將以上這些數(shù)據(jù)源先接入到分析平臺(tái)。數(shù)據(jù)接入通常由數(shù)據(jù)內(nèi)容的建設(shè)者(DE/DPM)完成,會(huì)對(duì)數(shù)據(jù)源進(jìn)行數(shù)據(jù)建模,即構(gòu)建表與表之間的關(guān)系,通過(guò)數(shù)據(jù)建模得到相應(yīng)的數(shù)據(jù)模型,在此模型之上,構(gòu)建數(shù)據(jù)集(數(shù)據(jù)集通常是一個(gè)業(yè)務(wù)域或者一個(gè)業(yè)務(wù)主題的集合)。在數(shù)據(jù)接入過(guò)程中,如果標(biāo)準(zhǔn)化的指標(biāo)維度會(huì)通過(guò)指標(biāo)中臺(tái),進(jìn)行規(guī)范化管理指標(biāo)/維度,再直接接入分析平臺(tái)。
數(shù)據(jù)接入后,分析平臺(tái)提供了一系列的分析能力,如基礎(chǔ)的數(shù)據(jù)分析能力(數(shù)據(jù)明細(xì)、數(shù)據(jù)聚合、跨源計(jì)算),在基礎(chǔ)的分析之上可以做一些復(fù)雜分析,如同環(huán)比、占比、LOD 分析、表計(jì)算等?;谶@些強(qiáng)大的分析能力,數(shù)據(jù)的終端消費(fèi)用戶(DA/運(yùn)營(yíng))通過(guò)多維分析和可視化可使用這些能力做分析。
2.快手分析場(chǎng)景性能挑戰(zhàn)
快手大數(shù)據(jù)分析平臺(tái),作為一個(gè)數(shù)據(jù)輸出平臺(tái),對(duì)于用戶而言,面臨的挑戰(zhàn)主要包括:
- 性能分析難:不清楚耗時(shí)在哪個(gè)環(huán)節(jié),平臺(tái)對(duì)用戶來(lái)說(shuō)是黑盒的;不了解數(shù)據(jù)消費(fèi)用戶的查詢特征;性能波動(dòng)難以歸因。
- 優(yōu)化門檻高:需要很強(qiáng)的知識(shí)背景,很強(qiáng)的專業(yè)領(lǐng)域性,而分析用戶通常是小白用戶無(wú)法自己進(jìn)行分析和優(yōu)化。
平臺(tái)方面,也面臨一些挑戰(zhàn):
- 分析復(fù)雜度高:30% 以上的復(fù)雜分析,包含同環(huán)比、占比、LOD 分析等;
- 引擎查詢復(fù)雜度高:關(guān)聯(lián)查詢多、數(shù)據(jù)量大,查詢時(shí)間范圍大;
- 引擎局限性:當(dāng)前快手主要的引擎是 ClickHouse,其對(duì)關(guān)聯(lián)查詢不友好,SQL 優(yōu)化不智能。(每個(gè)引擎都有其自身局限性)
3.快手分析場(chǎng)景性能優(yōu)化實(shí)踐
(1)打法策略
針對(duì)性能分析難的問(wèn)題,分析平臺(tái)通過(guò)進(jìn)行全鏈路埋點(diǎn),來(lái)得知性能耗時(shí)到底在哪個(gè)環(huán)節(jié)?;谶@些埋點(diǎn),平臺(tái)可對(duì)用戶進(jìn)行查詢畫(huà)像分析,從而了解用戶在分析什么指標(biāo)、在分析什么維度、分析的時(shí)間范圍。有了用戶畫(huà)像信息后,進(jìn)一步可構(gòu)建自主化數(shù)據(jù)集性能診斷分析工具,進(jìn)行開(kāi)放式自助的性能分析。
針對(duì)優(yōu)化門檻高的問(wèn)題,分析平臺(tái)會(huì)對(duì)查詢自動(dòng)優(yōu)化,包括緩存預(yù)熱、物化加速、查詢優(yōu)化等各種手段。此外,基于已有的用戶查詢畫(huà)像,可以用數(shù)據(jù)消費(fèi)來(lái)驅(qū)動(dòng)數(shù)據(jù)內(nèi)容,進(jìn)行相關(guān)優(yōu)化。
整體思路主要分為四步,即確定目標(biāo)、確認(rèn)團(tuán)隊(duì)(參與方)、性能分析(分析不同場(chǎng)景下性能原因)、制定解決方案并落地。
(2)確定目標(biāo)
分析性能的目標(biāo),是以分析平臺(tái)數(shù)據(jù)消費(fèi)用戶視角來(lái)評(píng)價(jià)分析平臺(tái)的性能,主要抽象成三個(gè)性能北極星指標(biāo):查詢平均耗時(shí)、查詢耗時(shí) P90、查詢成功率。針對(duì)三個(gè)指標(biāo),分場(chǎng)景來(lái)確定目標(biāo)值。比如在可視化看板場(chǎng)景下,大多是一些重要數(shù)據(jù)的沉淀,也是一些重要的人在看,所以對(duì)性能保障要求相對(duì)更高;對(duì)于多維分析場(chǎng)景,更自主化,靈活化,用于日常運(yùn)營(yíng),這時(shí)性能目標(biāo)可以定得相對(duì)寬松一些。
總的來(lái)說(shuō),性能目標(biāo)并沒(méi)有一個(gè)絕對(duì)值,需要根據(jù)公司的業(yè)務(wù)場(chǎng)景,各個(gè)業(yè)務(wù)團(tuán)隊(duì)的分析需求來(lái)達(dá)成。以指標(biāo)作為牽引,持續(xù)追蹤對(duì)性能優(yōu)化的效果。
(3)確認(rèn)團(tuán)隊(duì)
分析性能的提升不僅僅是分析平臺(tái)的,性能優(yōu)化是需要分析平臺(tái)團(tuán)隊(duì)、數(shù)倉(cāng)團(tuán)隊(duì)以及引擎團(tuán)隊(duì),三方來(lái)進(jìn)行合作共建,共同保障的。一個(gè)完整的分析鏈路包括引擎查詢 以及 分析平臺(tái)二次分析計(jì)算,其影響因素是多因子的,若僅僅從分析平臺(tái)本身做功,只能是把分析平臺(tái)內(nèi)部?jī)?yōu)化做好。但是一些數(shù)據(jù)內(nèi)容建設(shè)質(zhì)量提升,以及引擎層面計(jì)算優(yōu)化,需要三方來(lái)進(jìn)行合作共建。
(4)性能分析
做好性能優(yōu)化,我們首先要明確性能劣化的根因,進(jìn)而對(duì)癥下藥。平臺(tái)側(cè)希望通過(guò)沉淀通用的查詢性能分析工具,來(lái)幫助用戶進(jìn)行自助分析。自助分析的前提要有充分的元數(shù)據(jù),元數(shù)據(jù)主要是兩類,一個(gè)是分析服務(wù)的埋點(diǎn),另外是收集一些物理元數(shù)據(jù)。
結(jié)合兩類元數(shù)據(jù),則可以構(gòu)建數(shù)據(jù)集的查詢畫(huà)像數(shù)據(jù)。這樣就可以了解到,用戶在看哪些高熱的指標(biāo)維度、使用了哪些高熱表以及通常查詢哪些時(shí)間范圍的數(shù)據(jù),也可以看到分析平臺(tái)自己的一些指標(biāo),比如緩存命中率以及其它一些內(nèi)部查詢的耗時(shí),這些都可以根據(jù)元數(shù)據(jù)分析出來(lái)。另外,也有一些診斷的規(guī)則合集,這些診斷規(guī)則,主要是一些對(duì)查詢性能不友好的規(guī)則。基于畫(huà)像和規(guī)則,最終得到一個(gè)診斷結(jié)論:數(shù)據(jù)集可能存在哪些數(shù)據(jù)問(wèn)題、有哪些可以優(yōu)化的空間。常見(jiàn)的性能問(wèn)題可以基于分析工具來(lái)自助分析。
(5)解決方案
基于性能分析的結(jié)論,分析平臺(tái)側(cè)制定體系化的解決方案,推動(dòng)三個(gè)團(tuán)隊(duì)共同建設(shè),達(dá)成優(yōu)化目標(biāo)。分析平臺(tái)本身做平臺(tái)的性能優(yōu)化,通過(guò)比如緩存預(yù)熱、物化加速、查詢優(yōu)化等各種手段,優(yōu)化分析平臺(tái)的性能。分析平臺(tái)為數(shù)倉(cāng)提供數(shù)據(jù)集的性能診斷,把數(shù)據(jù)集可能存在的問(wèn)題,直接暴露給數(shù)倉(cāng)團(tuán)隊(duì),針對(duì)相應(yīng)問(wèn)題,來(lái)做針對(duì)化的數(shù)據(jù)建設(shè)優(yōu)化,比如一些高熱查詢可以做聚合表、加索引、做數(shù)據(jù)哈希等。
數(shù)倉(cāng)做的一些高質(zhì)量的數(shù)據(jù),也會(huì)接入數(shù)據(jù)平臺(tái),對(duì)用戶的體現(xiàn)就是性能和質(zhì)量的提升。引擎團(tuán)隊(duì)會(huì)對(duì)分析平臺(tái)和數(shù)倉(cāng),提供引擎方面的能力支持,也會(huì)做持續(xù)的性能優(yōu)化。
以下重點(diǎn)介紹分析平臺(tái)側(cè)做的一些優(yōu)化策略:
分析平臺(tái)性能優(yōu)化-緩存預(yù)熱
對(duì)于一些固化的看數(shù)場(chǎng)景,例如看板場(chǎng)景,提前把看板數(shù)據(jù)或圖表查詢放到緩存中,當(dāng)用戶使用時(shí),直接從緩存取數(shù)據(jù),這樣不管原始查詢的數(shù)據(jù)量有多大,直接讀緩存的性能一定是很高效的。
緩存預(yù)熱能力構(gòu)建主要是四部分,預(yù)熱觸發(fā)器、預(yù)熱計(jì)算器、預(yù)熱執(zhí)行器、預(yù)熱監(jiān)控。
預(yù)熱觸發(fā)器判斷什么情況下需要做緩存預(yù)熱。比如定時(shí)調(diào)度,在用戶高峰使用期,提前進(jìn)行緩存預(yù)熱。另外,進(jìn)行數(shù)據(jù)加速的同時(shí),也要保障數(shù)據(jù)質(zhì)量。
預(yù)熱計(jì)算器,計(jì)算歷史的哪些查詢、哪些圖表,是值得預(yù)熱、有價(jià)值的。通過(guò)觀察數(shù)據(jù)集的血緣,來(lái)知道數(shù)據(jù)是離線生產(chǎn)的還是實(shí)時(shí)生產(chǎn)的,很顯然實(shí)時(shí)生產(chǎn)的數(shù)據(jù)不適合做預(yù)熱。另外,對(duì)于一些固定化的、高熱的圖表做預(yù)熱。最終計(jì)算到,想要預(yù)熱的是哪些圖表,或者哪些用戶歷史查詢。
因?yàn)轭A(yù)熱執(zhí)行器預(yù)熱的量可能很大,考慮到對(duì)服務(wù)負(fù)載,要加入一些并發(fā)控制,最后把預(yù)熱的數(shù)據(jù)放到緩存中。
最后是預(yù)熱的監(jiān)控,監(jiān)控緩存預(yù)熱的執(zhí)行情況,執(zhí)行耗時(shí)以及緩存預(yù)熱的緩存命中率。經(jīng)過(guò)緩存預(yù)熱建設(shè),可視化看板場(chǎng)景的首屏命中率可達(dá)到 90%,非首屏的緩存命中率達(dá)到了 30%。
分析平臺(tái)性能優(yōu)化-查詢優(yōu)化
查詢的優(yōu)化首先會(huì)基于快手開(kāi)放分析表達(dá)式 OAX(快手面向分析場(chǎng)景的統(tǒng)一分析語(yǔ)言,上述所有分析場(chǎng)景都基于 OAX 構(gòu)建)。即將用戶最終的數(shù)據(jù)分析抽象成 OAX 語(yǔ)言,并對(duì)此 OAX 語(yǔ)言進(jìn)行解析,知道用戶有哪些高級(jí)計(jì)算,以及哪些是基于模型或者基于物理表的計(jì)算,然后會(huì)進(jìn)行一些初級(jí)的分析編排。
接著進(jìn)行 AST 優(yōu)化。AST 的葉子節(jié)點(diǎn)是從引擎來(lái)讀取數(shù)據(jù),但是對(duì)于分析平臺(tái)來(lái)說(shuō),有的是面向表,有的是面向模型(基于表與表之間的關(guān)系,構(gòu)建模型)。一個(gè)數(shù)據(jù)集可以有多個(gè)模型,一個(gè)指標(biāo)在多個(gè)模型中都可以支持。其中會(huì)進(jìn)行模型搜索的優(yōu)化,以保障選取的表或模型,是數(shù)據(jù)準(zhǔn)確的,同時(shí)保障選取的模型,其取數(shù)效率是最優(yōu)的。取到既滿足準(zhǔn)確性,又高效率的一個(gè)模型。
有了模型后,會(huì)把這個(gè)模型翻譯成引擎的查詢語(yǔ)言,并在翻譯中,做一些通用的或者 Native 的 SQL 優(yōu)化。
當(dāng)葉子節(jié)點(diǎn)也是面向引擎的 SQL 的時(shí)候,AST 就可以真正的物理編排,物理編排后就可以執(zhí)行了。
快手在查詢優(yōu)化過(guò)程中,沉淀了 50 多個(gè)通用的 & Native 優(yōu)化規(guī)則包括:
- 復(fù)雜分析查詢下推:占比或者同環(huán)比這些復(fù)雜分析,盡量轉(zhuǎn)換成一個(gè)完整的 SQL 下推執(zhí)行;
- 謂詞下推;
- 聚合算子優(yōu)化;
- JOIN 順序調(diào)整。
分析平臺(tái)性能優(yōu)化-物化加速
物化加速就是構(gòu)建一個(gè)最終的結(jié)果表,把數(shù)據(jù)計(jì)算過(guò)程通過(guò) ETL 生產(chǎn)直接生產(chǎn)到結(jié)果表內(nèi)。
快手物化加速當(dāng)前使用的是生成生產(chǎn)任務(wù)方式來(lái)做數(shù)據(jù)生產(chǎn),而非利用 OLAP 引擎物化能力。面對(duì)不同的應(yīng)用場(chǎng)景,有不同的性能目標(biāo),對(duì)歷史查詢的圈選也不一樣。
物化加速過(guò)程,首先是物化模型分析,把用戶歷史查詢的指標(biāo)維度,抽象成一個(gè)指標(biāo)維度的模型,找出超過(guò)性能目標(biāo)的指標(biāo)維度組合,分析其聚合比(聚合后的數(shù)據(jù)行數(shù)和原行數(shù)的比率,聚合比越低說(shuō)明聚合后的行數(shù)越少,最終的查詢效果越好)。接下來(lái),對(duì)所有這些高熱指標(biāo)維度物化模型做排序,綜合考慮物化模型的歷史查詢次數(shù)以及耗時(shí)進(jìn)行排序,選出一個(gè)或幾個(gè)收益會(huì)比較高的模型來(lái)做物化加速生產(chǎn)。
有了需要物化加速的目標(biāo)模型之后,會(huì)自動(dòng)生成生產(chǎn)任務(wù),然后生產(chǎn)任務(wù)進(jìn)行生產(chǎn),最終數(shù)據(jù)落到 Hive 或 ClickHouse。生產(chǎn)出的結(jié)果表,最終也會(huì)自動(dòng)接入分析平臺(tái),結(jié)果表與指標(biāo)進(jìn)行綁定。
這就是一種數(shù)據(jù)消費(fèi)驅(qū)動(dòng)生產(chǎn)的場(chǎng)景。知道數(shù)據(jù)終端的消費(fèi)是什么,然后來(lái)做數(shù)據(jù)生產(chǎn)。使得平均結(jié)果表的性能會(huì)有 50% 的提升。也會(huì)帶來(lái)效率提升,因?yàn)樽詣?dòng)生成的生產(chǎn)任務(wù),結(jié)果表也會(huì)自動(dòng)接入系統(tǒng),提升數(shù)據(jù)生產(chǎn)和接入效率。
(6)引擎的性能優(yōu)化-湖倉(cāng)一體 OLAP 引擎 Bleem
在引擎層面的優(yōu)化,快手的策略是構(gòu)建統(tǒng)一的湖倉(cāng)一體化分析引擎 Bleem,然后在 Bleem 支持高性能的引擎計(jì)算能力。其主要的能力建設(shè)包括以下幾點(diǎn):
首先緩存方面,構(gòu)建不同級(jí)別的緩存,包括元數(shù)據(jù)緩存、數(shù)據(jù)緩存、索引數(shù)據(jù)緩存。其次算子執(zhí)行方面,有向量化、多線程、分布式。以及物化視圖、優(yōu)化器(RBO&CBO 優(yōu)化器、針對(duì) JOIN 的優(yōu)化)。
Bleem 是快手正在推廣使用的湖倉(cāng)一體引擎。其定位不是為了替換 ClickHouse,ClickHouse 已經(jīng)滿足很多需求。湖倉(cāng)一體引擎 Bleem 會(huì)對(duì) ClickHouse 的一些痛點(diǎn)問(wèn)題進(jìn)行優(yōu)化,比如 join 的優(yōu)化,RBO&CBO 的優(yōu)化。另外,Bleem 直接面向數(shù)據(jù)湖,主要目的是提升數(shù)據(jù)湖的分析效率,最終目標(biāo)是實(shí)現(xiàn)接近 ClickHouse 的性能。這樣數(shù)據(jù)分析就可以直接從數(shù)據(jù)湖中進(jìn)行,避免一些數(shù)據(jù)生產(chǎn)的消耗。
4.未來(lái)展望
以上介紹了分析場(chǎng)景的性能優(yōu)化實(shí)踐??偨Y(jié)下來(lái),性能優(yōu)化是需要團(tuán)隊(duì)協(xié)同作戰(zhàn),才能實(shí)現(xiàn)最終面向用戶高效分析,例如分析診斷、查詢優(yōu)化、物化加速、緩存預(yù)熱、數(shù)倉(cāng)建設(shè)、引擎優(yōu)化等等。對(duì)于未來(lái)發(fā)展方向,數(shù)據(jù)分析有一個(gè)永恒的話題就是極致的分析性能,未來(lái)一定是軟硬結(jié)合來(lái)進(jìn)行優(yōu)化。最終的愿景目標(biāo)是能夠從問(wèn)題發(fā)現(xiàn)、分析、優(yōu)化能夠全鏈路自動(dòng)化/智能化,進(jìn)而減少人力投入,又能提供高效數(shù)據(jù)分析。
5.問(wèn)答環(huán)節(jié)
Q1:關(guān)于 Bleem 有沒(méi)有跟社區(qū)合作的一些發(fā)展計(jì)劃,例如開(kāi)源。
A1:了解到目前還沒(méi)有,這個(gè)還在持續(xù)優(yōu)化迭代過(guò)程中。
Q2:Bleem 在生態(tài)圈里屬于哪一層?
A2:數(shù)據(jù)湖的一個(gè)分析引擎。
Q3:物化優(yōu)化能不能優(yōu)化跨表 JOIN?
A3:可以的。物化有兩種模式,一種是聚合模式,另一種是全量模式,主要是優(yōu)化 JOIN。