Hologres如何支持亿级用户UV计算
簡(jiǎn)介: 本文將介紹阿里云Hologres如何基于RoaringBitmap進(jìn)行UV等高復(fù)雜度計(jì)算的方案,實(shí)現(xiàn)億級(jí)用戶萬(wàn)級(jí)標(biāo)簽亞秒級(jí)分析,幫助用戶從Kylin平滑遷移到Hologres,實(shí)現(xiàn)更實(shí)時(shí)、開(kāi)發(fā)更靈活、功能更完善的多維分析能力。
背景介紹
在用戶行為分析和圈人場(chǎng)景中,經(jīng)常需要從億級(jí)甚至十億級(jí)用戶中快速篩選出符合特定標(biāo)簽的用戶統(tǒng)計(jì),很多企業(yè)會(huì)使用Apache Kylin(下文簡(jiǎn)稱Kylin)來(lái)支持這樣的場(chǎng)景。但是Apache Kylin的核心是預(yù)計(jì)算,當(dāng)遇上設(shè)計(jì)不合理的Cube,或者需求維度多的場(chǎng)景時(shí),會(huì)遇到維度爆炸,Cube構(gòu)建時(shí)間長(zhǎng),SQL函數(shù)不支持等問(wèn)題。
本文將介紹阿里云Hologres如何基于RoaringBitmap進(jìn)行UV等高復(fù)雜度計(jì)算的方案,實(shí)現(xiàn)億級(jí)用戶萬(wàn)級(jí)標(biāo)簽亞秒級(jí)分析,幫助用戶從Kylin平滑遷移到Hologres,實(shí)現(xiàn)更實(shí)時(shí)、開(kāi)發(fā)更靈活、功能更完善的多維分析能力。
Apache Kylin與Hologres的對(duì)比
| 對(duì)比項(xiàng) | Apache Kylin | Hologres | 差異點(diǎn) |
| 定位 | MOLAP on Hadoop | Real-Time MPP Data Warehouse | - |
| 建模方式 | 星型、雪花模型 | 寬表模型、主題模型 | Hologres無(wú)需復(fù)雜建模理論和建模過(guò)程,數(shù)據(jù)導(dǎo)入即可查 |
| 核心原理 | 空間換時(shí)間,減少運(yùn)行時(shí)計(jì)算,預(yù)計(jì)算Cube,依賴Hadoop | 并行計(jì)算、列存、向量化,充分利用多節(jié)點(diǎn),多核計(jì)算資源 | Hologres沒(méi)有存儲(chǔ)爆炸問(wèn)題,無(wú)需預(yù)構(gòu)建等待 |
| 運(yùn)維方式 | 依賴YARN,HBase,ZK等,外部依賴多 | 計(jì)算存儲(chǔ)分離,彈性伸縮,升級(jí)平滑,無(wú)外部依賴 | Hologres托管式運(yùn)維,運(yùn)維簡(jiǎn)單,無(wú)需Hadoop技能 |
| 使用場(chǎng)景 | 固定報(bào)表,固定維度組合,固定指標(biāo)服務(wù),秒級(jí)響應(yīng) | 敏捷自助報(bào)表、自助式分析、探索式分析、自助取數(shù)、在線數(shù)據(jù)服務(wù),秒級(jí)響應(yīng) | Hologres分析更敏捷,無(wú)限制,支持完善的SQL Join,嵌套查詢,窗口函數(shù)等 |
| 查詢接口 | 自定義JDBC,ODBC,有限SQL能力 | 兼容PostgreSQL,標(biāo)準(zhǔn)JDBC、ODBC,支持標(biāo)準(zhǔn)SQL | Hologres兼容開(kāi)源生態(tài),SQL標(biāo)準(zhǔn) |
| 開(kāi)發(fā)效率 | 依賴于建模人員的熟練度,掌握Kylin的復(fù)雜建模技巧 | 針對(duì)“表”設(shè)計(jì),概念簡(jiǎn)單 | Hologres上手容易,學(xué)習(xí)門檻低 |
| 數(shù)據(jù)時(shí)效性 | T+1,加工流程長(zhǎng),數(shù)據(jù)修正慢,模型修改成本非常高 | 實(shí)時(shí),寫(xiě)入即可查,數(shù)據(jù)可更新,模型可變更 | Hologres T+0,全實(shí)時(shí) |
使用Hologres方案的收益:實(shí)時(shí)、靈活、簡(jiǎn)單
基于上述的比較,我們看到Kylin和Hologres擁有一些共同的場(chǎng)景:海量數(shù)據(jù)交互式分析、亞秒級(jí)響應(yīng)、橫向擴(kuò)展能力。Kylin有很多優(yōu)點(diǎn),包括:最小化查詢開(kāi)銷,以點(diǎn)查的性能完成多維分析,查詢性能更穩(wěn)定,利用Bitmap支持全局精確去重。同時(shí)也發(fā)現(xiàn)了一些Kylin的使用難點(diǎn),包括:建模復(fù)雜(主要由IT團(tuán)隊(duì)負(fù)責(zé)建模),Cube膨脹(存儲(chǔ)成本高),構(gòu)建Cube時(shí)間長(zhǎng)(業(yè)務(wù)不實(shí)時(shí),構(gòu)建任務(wù)資源消耗大),模型不可變(業(yè)務(wù)不敏捷),SQL支持能力弱(固定的Join連接條件、有限的SUM COUNT算子,BI兼容度低,SQL協(xié)議不標(biāo)準(zhǔn)),可擴(kuò)展能力弱(UDF少)。
?
遷移到Hologres之后,可以獲得的收益包括:建模簡(jiǎn)單(面向表,DWD&DWS),SQL能力強(qiáng)(兼容PostgreSQL11,支持Ad-Hoc Query),數(shù)據(jù)鏈路實(shí)時(shí)(寫(xiě)入即可見(jiàn)),運(yùn)維簡(jiǎn)單(無(wú)Hadoop依賴)
?
如何從Kylin遷移到Hologres
- 架構(gòu)調(diào)整:從Hadoop/HBase架構(gòu),調(diào)整到MPP數(shù)據(jù)倉(cāng)庫(kù)Hologres,去Hadoop,ZK等依賴
- 建模上:從面向指標(biāo)的多維建模,調(diào)整為面向表的DWD、DWS分層建模,DWD為主,性能敏感時(shí)補(bǔ)充DWS甚至ADS,關(guān)注Query SLA,避免超大Query,通過(guò)基礎(chǔ)聚合結(jié)果集作為輕量匯總的DWS,滿足95%場(chǎng)景。
- 學(xué)習(xí)上:學(xué)習(xí)Cube優(yōu)化技巧到學(xué)習(xí)Hologres索引設(shè)計(jì)、查詢優(yōu)化、資源監(jiān)控
- 存儲(chǔ)上:從單一的HBase存儲(chǔ),到冷熱數(shù)據(jù)分層存儲(chǔ)(Hologres+MaxCompute)
- 場(chǎng)景上:通過(guò)Hologres提供更敏捷、更靈活的自助式分析,加速數(shù)據(jù)產(chǎn)品創(chuàng)新
- 分工上:IT從關(guān)注建模的構(gòu)建質(zhì)量到關(guān)注平臺(tái)的開(kāi)發(fā)效率,更多服務(wù)業(yè)務(wù)價(jià)值
實(shí)現(xiàn)原理
在場(chǎng)景遷移之前,首先介紹以下精確去重和累加計(jì)算在Kylin和Hologres上不同的實(shí)現(xiàn)方式,以便于根據(jù)不同場(chǎng)景選用不同的方式去遷移原有業(yè)務(wù)。
如下圖所示,Kylin根據(jù)維度和度量,進(jìn)行多次預(yù)計(jì)算生成2^n個(gè)cuboid(n為維度數(shù)量)來(lái)構(gòu)建cube。查詢時(shí),根據(jù)查詢的維度,映射到相應(yīng)的cuboid得到度量結(jié)果。Cube相比原始明細(xì)數(shù)據(jù)會(huì)有N倍的數(shù)據(jù)膨脹,且非常不靈活。
?
?
對(duì)于Hologres來(lái)說(shuō),去做精確去重和累加計(jì)算則更為靈活:
- 明細(xì)數(shù)據(jù)不多或者QPS要求不高的場(chǎng)景:直接利用SQL語(yǔ)句從明細(xì)表中對(duì)統(tǒng)計(jì)維度進(jìn)行Group by,對(duì)指標(biāo)用聚合函數(shù)計(jì)算度量結(jié)果。這種方法可以獲得最大的靈活性,能充分利用Hologres強(qiáng)大的計(jì)算能力,可進(jìn)行任意復(fù)雜的查詢,實(shí)現(xiàn)數(shù)億條記錄的毫秒級(jí)分析。
?
- 數(shù)據(jù)量大且高QPS場(chǎng)景:在Hologres中將明細(xì)表按照基礎(chǔ)維度最細(xì)粒度做Group by,對(duì)指標(biāo)進(jìn)行預(yù)聚合運(yùn)算生成一份DWS表。查詢時(shí)對(duì)DWS表按照統(tǒng)計(jì)維度Group by,對(duì)指標(biāo)的預(yù)聚合結(jié)果進(jìn)行聚合計(jì)算即可。通過(guò)DWS層,極大的減少數(shù)據(jù)量,從而實(shí)現(xiàn)高QPS的查詢要求。相比于DWD(明細(xì)層),DWS層的數(shù)據(jù)量正常只有DWD層的1/100甚至更少,這點(diǎn)類似于Kylin中的Base Cuboid結(jié)構(gòu)。
?
- 當(dāng)然在Hologres上也可以采用類似Kylin構(gòu)建Cube的方式:將明細(xì)表按照所需的各種維度組合做Group by,或者Cube、Rollup、Grouping Sets等原生表達(dá)式,對(duì)指標(biāo)進(jìn)行預(yù)聚合運(yùn)算。但是同樣也會(huì)存在數(shù)據(jù)膨脹問(wèn)題,一般情況下按照上述方案即可。
?
綜上所述,Kylin對(duì)可累加指標(biāo)或精確去重指標(biāo)的查詢時(shí),需構(gòu)建Cube才能獲取較高性能,這將引入額外的預(yù)計(jì)算和數(shù)據(jù)膨脹。而Hologres則更為靈活:
-
- 對(duì)于DWD層數(shù)據(jù)量不大或者查詢QPS要求不高的場(chǎng)景,無(wú)需預(yù)計(jì)算,可直接在DWD層上進(jìn)行查詢,即可獲得很好的性能與最大的靈活性;
- 對(duì)于DWD層數(shù)據(jù)量較大且有高QPS查詢的場(chǎng)景,可根據(jù)基礎(chǔ)維度進(jìn)行一次預(yù)計(jì)算,并只生成一份DWS表,查詢時(shí)按需選取維度查詢即可。不會(huì)引入過(guò)多的預(yù)計(jì)算和數(shù)據(jù)膨脹問(wèn)題。
?
本文下面將會(huì)介紹基于Hologres的DWS層構(gòu)造和查詢方案。
遷移可累加指標(biāo)
?
DWS層的構(gòu)造中,最重要的就是各種度量數(shù)據(jù)(指標(biāo))的聚合,需要保證各指標(biāo)都是可累計(jì)的。對(duì)于SUM、COUNT、MIN、MAX、AVG(可通過(guò)保留兩個(gè)字段:sum和count來(lái)解決),指標(biāo)的可累計(jì)是非常簡(jiǎn)單的。
但對(duì)于COUNT DISTINCT類的指標(biāo)(需要精確去重的指標(biāo),例如UV),也需要保證在DWS中,這個(gè)指標(biāo)是可累計(jì)的,可通過(guò)Hologres原生支持的RoaringBitmap數(shù)據(jù)類型來(lái)進(jìn)行計(jì)算和保存。
?
遷移不可累加指標(biāo)(精確去重場(chǎng)景)
下面通過(guò)一個(gè)案例介紹Hologres中通過(guò)DWS來(lái)計(jì)算大時(shí)間范圍的PV、UV的最佳實(shí)踐。
PV (Page View): 字面含義頁(yè)面訪問(wèn)量,比如一天內(nèi)頁(yè)面的累計(jì)訪問(wèn)量。其實(shí)也可引申為某段時(shí)間內(nèi)某個(gè)指標(biāo)的累加量。比如:雙十一期間某件商品的點(diǎn)擊量,活動(dòng)促銷期間某個(gè)地區(qū)的訂單量等。
?
UV (Unique Visitor) : 訪問(wèn)網(wǎng)頁(yè)的自然人,如果有20個(gè)人一天訪問(wèn)某個(gè)頁(yè)面100次,這一天就是20個(gè)UV??梢砸隇槟扯螘r(shí)間內(nèi)某個(gè)指標(biāo)精確去重后的量。
?
PV和UV是分析場(chǎng)景中比較重要的兩個(gè)指標(biāo),下面將以T+1離線場(chǎng)景為案例,進(jìn)行PV UV計(jì)算的介紹。
案例背景
每天有幾億條數(shù)據(jù),客戶總量千萬(wàn)級(jí),每日UV在百萬(wàn)級(jí),需要T+1根據(jù)十個(gè)左右維度(支持維度間任意組合)查詢一天,一周,或者一個(gè)月甚至半年期間相應(yīng)的用戶數(shù)去重統(tǒng)計(jì)信息,得出用戶數(shù)精確去重指標(biāo)UV,以及訪問(wèn)量PV。
?
一般方式的UV PV計(jì)算
如果不采取任何預(yù)聚合運(yùn)算,上述場(chǎng)景計(jì)算用戶數(shù)精確去重指標(biāo)UV和訪問(wèn)量PV,SQL如下:
select count(distinct uid) as uv, count(1) as pv from src_t group by dim1, dim2where ymd ='20210426';select count(distinct uid) as uv, count(1) as pv from src_t group by dim1, dim5, dim9where ymd like '202103%'; --查詢區(qū)間為3月份--group by的字段是固定維度的中任意維度的組合 --where 過(guò)濾的區(qū)間范圍 從一天到半年不等--因此有多少維度和時(shí)間的組合需求,就需要查詢多少個(gè)這樣count distinct sql,每條在查詢時(shí)都需要大量計(jì)算這種方式下,根據(jù)查詢區(qū)間,每次查詢要對(duì)幾億條到幾十億甚至幾百億條數(shù)據(jù)進(jìn)行多個(gè)維度的Group by,然后再使用COUNT DISTINCT進(jìn)行精確去重,會(huì)產(chǎn)生大量的數(shù)據(jù)交換計(jì)算,實(shí)時(shí)地得到結(jié)果需要一定量的計(jì)算資源,大大增加用戶的成本。
?
基于Bitmap方式計(jì)算精確去重
Hologres內(nèi)置Bitmap類型,通過(guò)計(jì)算一定維度組合條件下的Bitmap結(jié)果集,把維度的所有組合生成預(yù)計(jì)算的結(jié)果表,簡(jiǎn)單原理如下:
查詢時(shí),根據(jù)查詢時(shí)的維度,查詢對(duì)應(yīng)的預(yù)計(jì)算結(jié)果表對(duì)桶進(jìn)行聚合運(yùn)算即可達(dá)到亞秒級(jí)查詢。
--計(jì)算bitmapinsert into result_t select RB_BUILD_AGG(uid) as uv_bitmap, count(1) as pvfrom src_tgroup by dim, ymd; --存在跨天查詢的需求,日期也必須加到group by維度中--查詢時(shí) select RB_CARDINALITY(RB_OR_AGG(uv_bitmap)), pv from result_t where ymd = '20210426'select RB_CARDINALITY(RB_OR_AGG(uv_bitmap)), pv from result_twhere ymd >= '20210301' and ymd <= '20210331'?
后面我們將會(huì)陸續(xù)推出Hologres基于RoaringBitmap的高效UV計(jì)算最佳實(shí)踐,主要內(nèi)容如下,敬請(qǐng)期待:
- Hologres使用RoaringBitmap實(shí)現(xiàn)高效UV計(jì)算
- Hologres使用Flink+RoaringBitmap實(shí)現(xiàn)實(shí)時(shí)UV計(jì)算
參考文檔
Apache Kylin:http://kylin.apache.org/
Kylin精確去重:https://blog.bcmeng.com/post/kylin-distinct-count-global-dict.html
Hologres RoaringBitmap函數(shù):https://help.aliyun.com/document_detail/216945.htm
原文鏈接
本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的Hologres如何支持亿级用户UV计算的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据湖 VS 数据仓库之争?阿里提出大数
- 下一篇: Java编程技巧之样板代码