ITBear旗下自媒體矩陣:

億級(jí)大表毫秒關(guān)聯(lián),荔枝微課基于騰訊云數(shù)據(jù)倉(cāng)庫(kù)Doris的統(tǒng)一實(shí)時(shí)數(shù)倉(cāng)建設(shè)實(shí)踐

   時(shí)間:2023-06-02 14:02:39 來源:互聯(lián)網(wǎng)編輯:茹茹 發(fā)表評(píng)論無障礙通道

本文導(dǎo)讀

騰訊云數(shù)據(jù)倉(cāng)庫(kù) Doris 助力荔枝微課構(gòu)建了規(guī)范的、計(jì)算統(tǒng)一的實(shí)時(shí)數(shù)倉(cāng)平臺(tái)。目前騰訊云數(shù)據(jù)倉(cāng)庫(kù) Doris 已經(jīng)支撐了荔枝微課內(nèi)部 90% 以上的業(yè)務(wù)場(chǎng)景,整體可達(dá)到毫秒級(jí)的查詢響應(yīng),數(shù)據(jù)時(shí)效性完成 T+1 到分鐘級(jí)的提升,開發(fā)效率更是實(shí)現(xiàn)了 50% 的增長(zhǎng),滿足了各業(yè)務(wù)場(chǎng)景需求、實(shí)現(xiàn)降本提效,深得十方融海各數(shù)據(jù)部門高度認(rèn)可。

作者|荔枝微課數(shù)據(jù)中臺(tái)組組長(zhǎng) 陳城

深圳十方融??萍加邢薰境闪⒂?2016 年,是一家數(shù)字職業(yè)在線教育頭部企業(yè),業(yè)務(wù)涵蓋“數(shù)字職業(yè)技能課程、知識(shí)分享平臺(tái)「荔枝微課」、智慧教育解決方案「女媧云教室」”,推出了多類數(shù)字素養(yǎng)與數(shù)字技能課程服務(wù),助力用戶在數(shù)字時(shí)代實(shí)現(xiàn)技能進(jìn)階與職業(yè)進(jìn)階。2016年上線的荔枝微課,已發(fā)展成為國(guó)內(nèi)頭部知識(shí)分享平臺(tái)。2021年上線女媧云教室,實(shí)現(xiàn)了“教學(xué)練”一體化模式,填補(bǔ)了國(guó)內(nèi)在線教學(xué)與實(shí)操脫軌的空白。

一、業(yè)務(wù)介紹   

荔枝微課隸屬于深圳十方融??萍加邢薰荆且粋€(gè)免費(fèi)使用的在線教育平臺(tái)。荔枝微課擁有海量的知識(shí)內(nèi)容,包括直播視頻、錄播視頻、音頻等多種形式。通過技術(shù)和數(shù)據(jù)的賦能,推進(jìn)荔枝微課持續(xù)創(chuàng)新,也為微課平臺(tái)方和合作伙伴在視頻的創(chuàng)新和銷售方面提供了更強(qiáng)勁的支持。在業(yè)務(wù)運(yùn)營(yíng)過程中我們需要對(duì)用戶進(jìn)行全方位分析,高效為業(yè)務(wù)賦能。數(shù)據(jù)平臺(tái)旨在集成各種數(shù)據(jù)源的數(shù)據(jù),整合形成數(shù)據(jù)資產(chǎn),為業(yè)務(wù)提供用戶全鏈路生命周期、實(shí)時(shí)指標(biāo)分析、標(biāo)簽圈選等分析服務(wù)。

二、早期架構(gòu)及痛點(diǎn)

#FormatImgID_0#

早期架構(gòu)選用的是 Hadoop 生態(tài)圈組件,以 Spark 批計(jì)算引擎為核心構(gòu)建了最初的離線數(shù)倉(cāng)架構(gòu),基于 Flink 計(jì)算引擎進(jìn)行實(shí)時(shí)處理。從源端采集到的業(yè)務(wù)數(shù)據(jù)和日志數(shù)據(jù)將分為實(shí)時(shí)和離線兩條鏈路:在實(shí)時(shí)部分,業(yè)務(wù)庫(kù)數(shù)據(jù)通過 Binlog 的方式接入,日志數(shù)據(jù)使用 Flume-Kafka-Sink 進(jìn)行實(shí)時(shí)采集,利用 Flink 將數(shù)據(jù)計(jì)算寫入到 Kafka 和 MySQL中。在實(shí)時(shí)數(shù)倉(cāng)的內(nèi)部,遵守?cái)?shù)據(jù)分層的理論以實(shí)現(xiàn)最大程度的數(shù)據(jù)復(fù)用。

在離線部分,利用 Sqoop 和 DataX 對(duì)全量和增量業(yè)務(wù)庫(kù)中的數(shù)據(jù)進(jìn)行定時(shí)同步,日志數(shù)據(jù)通過 Flume 和日志服務(wù)進(jìn)行采集。當(dāng)不同數(shù)據(jù)源進(jìn)入到離線數(shù)倉(cāng)后,首先使用 Hive on Spark/Tez 進(jìn)行定時(shí)調(diào)度處理,接著根據(jù)維度建模經(jīng)過 ODS、DWD、DWS、ADS 層數(shù)據(jù),這些數(shù)據(jù)存儲(chǔ)在 HDFS 和對(duì)象存儲(chǔ) COS 上,最終利用 Presto 進(jìn)行數(shù)據(jù)查詢展示,并通過 metabase 提供交互式分析服務(wù)。同時(shí)為了保障數(shù)據(jù)的一致性,我們會(huì)通過離線數(shù)據(jù)對(duì)實(shí)時(shí)數(shù)據(jù)進(jìn)行定期覆蓋。

問題與挑戰(zhàn):基于 Hadoop 的早期架構(gòu)可以滿足我們的初步需求,而面對(duì)較為復(fù)雜的分析訴求則顯得心有余而力不足,再加上近年來,荔枝微課用戶體量不斷上升,數(shù)據(jù)量呈指數(shù)級(jí)上升,為了更好地為業(yè)務(wù)賦能,提高用戶使用體驗(yàn),業(yè)務(wù)側(cè)對(duì)數(shù)據(jù)的實(shí)時(shí)性、可用性、響應(yīng)速度也提出了更高的要求。在這樣的背景下,早期架構(gòu)暴露的問題也越發(fā)明顯:

·組件繁多,維護(hù)復(fù)雜,運(yùn)維難度非常高

·數(shù)據(jù)處理鏈路過長(zhǎng),導(dǎo)致查詢延遲變高

·當(dāng)有新的數(shù)據(jù)需求時(shí),牽一發(fā)而動(dòng)全身,所需開發(fā)周期比較長(zhǎng)

·數(shù)據(jù)時(shí)效性低,只可滿足 T+1 的數(shù)據(jù)需求,從而也導(dǎo)致數(shù)據(jù)分析效率低下

三、技術(shù)選型

通過對(duì)數(shù)據(jù)規(guī)模及早期架構(gòu)存在的問題進(jìn)行評(píng)估,我們決定引入一款實(shí)時(shí)數(shù)倉(cāng)來搭建新的數(shù)據(jù)平臺(tái),同時(shí)希望新的 OLAP 引擎可以具備以下能力:

·支持 Join 操作,可滿足不同業(yè)務(wù)用戶靈活多變的分析需求

·支持高并發(fā)查詢,可滿足日常業(yè)務(wù)的報(bào)表分析需求

·性能強(qiáng)悍,可以在海量數(shù)據(jù)場(chǎng)景下實(shí)現(xiàn)快速響應(yīng)

·運(yùn)維簡(jiǎn)單,縮減運(yùn)維人力的投入和成本的支出,實(shí)現(xiàn)降本提效

·統(tǒng)一數(shù)倉(cāng)構(gòu)建,簡(jiǎn)化繁瑣的大數(shù)據(jù)軟件棧

·社區(qū)活躍,在使用過程中遇到問題,可迅速與社區(qū)取得聯(lián)系

基于以上要求,我們快速定位了 Apache Doris 和 ClickHouse 這兩款開源 OLAP 引擎 ,這兩款引擎都是當(dāng)下使用較為廣泛、口碑不錯(cuò)的產(chǎn)品。在調(diào)研中發(fā)現(xiàn),ClickHouse在寬表查詢時(shí)有著非常出色的性能表現(xiàn),寫入速度快,對(duì)于大量的數(shù)據(jù)更新非常實(shí)用;但對(duì)于join場(chǎng)景,通常需要額外的調(diào)優(yōu)才能有較好的表現(xiàn)。而我們?cè)诖蠖鄶?shù)業(yè)務(wù)場(chǎng)景中都需要基于明細(xì)數(shù)據(jù)進(jìn)行大數(shù)據(jù)量的 Join,相比而言,Apache Doris 多表 Join 能力強(qiáng)悍,高并發(fā)能力優(yōu)異,完全可以滿足我們?nèi)粘5臉I(yè)務(wù)報(bào)表分析需求。除此之外,Apache Doris 可以同時(shí)支持實(shí)時(shí)數(shù)據(jù)服務(wù)、交互數(shù)據(jù)分析和離線數(shù)據(jù)處理多種場(chǎng)景,并且支持 Multi Catalog ,可以實(shí)現(xiàn)統(tǒng)一的數(shù)據(jù)門戶,這幾個(gè)特點(diǎn)都是我們核心考慮的幾個(gè)能力。

同時(shí),我們也了解到騰訊云數(shù)據(jù)倉(cāng)庫(kù) Doris這款產(chǎn)品。作為一款支持在線業(yè)務(wù)和多維分析的實(shí)時(shí)數(shù)倉(cāng)產(chǎn)品,騰訊云數(shù)據(jù)倉(cāng)庫(kù) Doris 100% 兼容開源 Apache Doris,整體架構(gòu)簡(jiǎn)潔易用,極簡(jiǎn)運(yùn)維,彈性伸縮,功能完備,一站式的分析解決方案,滿足各種業(yè)務(wù)數(shù)據(jù)分析場(chǎng)景,能夠助力企業(yè)快速構(gòu)建云上數(shù)據(jù)分析平臺(tái)。

在多源數(shù)據(jù)加工方面, Flink 有著優(yōu)秀的表現(xiàn)滿足我們的實(shí)時(shí)數(shù)據(jù)加工訴求,我們選擇了騰訊云大數(shù)據(jù) EMR-Flink。騰訊云EMR是一款基于云原生技術(shù)和泛 Hadoop 生態(tài)開源技術(shù)的安全、低成本、高可靠的開源大數(shù)據(jù)平臺(tái),提供了非常豐富的組件選項(xiàng)。而作為云原生大數(shù)據(jù)產(chǎn)品,騰訊云數(shù)據(jù)倉(cāng)庫(kù) Doris與EMR這兩款產(chǎn)品之間能夠無縫集成與聯(lián)動(dòng)。

基于以上優(yōu)勢(shì),我們最終選擇與騰訊云大數(shù)據(jù)合作,采用騰訊云數(shù)據(jù)倉(cāng)庫(kù) Doris + EMR 來搭建新的實(shí)時(shí)數(shù)倉(cāng)架構(gòu)體系。

四、新的架構(gòu)及方案

#FormatImgID_1#

在新的架構(gòu)中我們采取 騰訊云數(shù)據(jù)倉(cāng)庫(kù) Doris 和 騰訊云EMR-Flink 來構(gòu)建實(shí)時(shí)數(shù)倉(cāng),多種數(shù)據(jù)源的數(shù)據(jù)經(jīng)過 Flink CDC 或 Flink 加工處理后,入庫(kù)到 Kafka 和 Doris 中,最終由 Doris 提供統(tǒng)一的查詢服務(wù)。在數(shù)據(jù)同步上,一般通過 Flink CDC 將 RDS 數(shù)據(jù)實(shí)時(shí)同步到 Doris,通過 Flink 將 Kafka 的日志數(shù)據(jù)加工處理到 Doris,重要的指標(biāo)數(shù)據(jù)一般由 Flink 計(jì)算,再經(jīng)過 Kafka 分層處理寫入到 Doris 中。

·在存儲(chǔ)媒介上,主要使用 騰訊云數(shù)據(jù)倉(cāng)庫(kù) Doris 進(jìn)行流批數(shù)據(jù)的統(tǒng)一存儲(chǔ)。

·架構(gòu)收益:成功構(gòu)建了規(guī)范的、計(jì)算統(tǒng)一的實(shí)時(shí)數(shù)倉(cāng)平臺(tái),騰訊云數(shù)據(jù)倉(cāng)庫(kù) Doris 的 Multi Catalog 功能助力我們統(tǒng)一了不同數(shù)據(jù)源出口,實(shí)現(xiàn)聯(lián)邦查詢。同時(shí)利用外部表插入的方式進(jìn)行快速數(shù)據(jù)同步和修復(fù),真正實(shí)現(xiàn)了統(tǒng)一數(shù)據(jù)門戶。

·數(shù)據(jù)實(shí)時(shí)性有效提升,通過 Flink + Doris 架構(gòu),實(shí)時(shí)性從早期 T+1 縮短為的分鐘級(jí)延遲。并發(fā)能力強(qiáng),可以覆蓋更多的業(yè)務(wù)場(chǎng)景。

·極大地減少了運(yùn)維成本,Doris 架構(gòu)簡(jiǎn)單,只有 FE 和 BE 兩個(gè)進(jìn)程,不依賴其他系統(tǒng);另外,集群擴(kuò)縮容非常簡(jiǎn)單,可實(shí)現(xiàn)用戶無感知擴(kuò)容。

·開發(fā)周期從周級(jí)別降至天級(jí)別,開發(fā)周期大幅縮短,開發(fā)效率較之前提升了 50 %。

五、搭建經(jīng)驗(yàn)

數(shù)據(jù)建模

結(jié)合騰訊云數(shù)據(jù)倉(cāng)庫(kù) Doris 的特性,我們對(duì)數(shù)據(jù)倉(cāng)庫(kù)進(jìn)行了建模,建模方式與傳統(tǒng)數(shù)倉(cāng)類似:

1、ODS 層:ODS 層日志數(shù)據(jù)選擇 Duplicate 模型的分區(qū)表,分區(qū)表方便進(jìn)行數(shù)據(jù)修復(fù),Duplicate 模型還可以減少非必要的 Compaction。ODS 層業(yè)務(wù)庫(kù)數(shù)據(jù)采用 Unique 數(shù)據(jù)模型(業(yè)務(wù)庫(kù) MySQL 單表數(shù)據(jù)通過 Flink CDC 實(shí)時(shí)同步到 Doris,Kafka 日志數(shù)據(jù)經(jīng) Flink 清洗,通過 Doris 的 Routine Load 寫入 Doris 作為 ODS 層),DISTRIBUTED BY HASH KEY 根據(jù)具體的業(yè)務(wù)場(chǎng)景進(jìn)行選擇:

如果考慮機(jī)器資源,可選擇均勻分布的 KEY,讓 Tablet 數(shù)據(jù)能夠均勻分布,使得查詢時(shí)各 BE 資源能夠充分利用,避免出現(xiàn)木桶效應(yīng);

如果考慮大表 Join 性能,可以依據(jù) Colocate Join 特性進(jìn)行創(chuàng)建,讓 Join 查詢更高效;

Doris 1.2 版本中 Unqiue 模型開始支持寫時(shí)合并 Merge On Write,進(jìn)一步提升了 Unique 模型的查詢性能;

2、DWD 層:對(duì)于通過 Flink 將數(shù)據(jù)進(jìn)行 Join 打?qū)捥幚矸謩e寫入 Doris 和 Kafka 中的場(chǎng)景,選擇使用 Unique 數(shù)據(jù)模型;

對(duì)于高頻查詢的寬表選擇 Doris 的 Aggregate 模型,使用 REPLACE_IF_NOT_NULL 字段類型,將多個(gè)事實(shí)單表進(jìn)行插入,通過 Doris 的 Compaction 機(jī)制可以有效減少 Flink 狀態(tài) TTL 導(dǎo)致歷史數(shù)據(jù)沒有及時(shí)更新的問題。

3、DWS 層和 ADS 層:主要采用 Unique 數(shù)據(jù)模型,DWS 層根據(jù)數(shù)據(jù)量大小按天、月進(jìn)行分區(qū)。除此之外,我們還會(huì)利用INSERT INTO語(yǔ)句進(jìn)行 5 分鐘的任務(wù)調(diào)度和 T+1 的任務(wù)修復(fù)來進(jìn)行數(shù)倉(cāng)分層,便于需求的快速開發(fā)和實(shí)時(shí)數(shù)據(jù)修復(fù)。對(duì)于 Duplicate 模型的數(shù)據(jù)表,我們會(huì)創(chuàng)建 Rollup 的物化視圖,通過擊中物化視圖查詢能夠加快上層表查詢效率。

數(shù)據(jù)開發(fā)

在荔枝微課業(yè)務(wù)中,運(yùn)營(yíng)人員經(jīng)常會(huì)有調(diào)整直播課程信息、修改專欄名稱等操作,針對(duì)維度快速變化但寬表中維度列沒有及時(shí)更新的場(chǎng)景,為了能更好地滿足業(yè)務(wù)需求,我們利用 Doris Aggregate 模型 的 REPLACE_IF_NOT_NULL字段特性,通過 Flink CDC 多表分別寫入 Doris 維度表的部分列。當(dāng)課程維度表數(shù)據(jù)發(fā)生變化時(shí),需要查詢上層維度(專欄和直播間),對(duì)維度表補(bǔ)全,再將數(shù)據(jù)插入到 Doris 中;當(dāng)上層維度(專欄和直播間)發(fā)生變化時(shí),需要下鉆查詢課程表,補(bǔ)全對(duì)應(yīng)的課程 ID ,再將數(shù)據(jù)插入到 Doris 中。通過該方式可以保證維度表中所有字段的實(shí)時(shí)性,數(shù)據(jù)查詢時(shí)再通過寬表來關(guān)聯(lián)維表補(bǔ)全維度字段展示數(shù)據(jù)。

1685684286120005212.jpg

庫(kù)表設(shè)計(jì)

在初期設(shè)計(jì)階段,為了更好地利用騰訊云數(shù)據(jù)倉(cāng)庫(kù) Doris 提供的 Colocation Join 功能,我們特別設(shè)計(jì)了事實(shí)表的主鍵,如下圖示例:

1685684307644022067.jpg

在業(yè)務(wù)庫(kù)中課程表 A 和課程表 B 的關(guān)系是A.id=B.lecture_id,為了實(shí)現(xiàn) Colocation Join,我們將 B 的distributed by hash key設(shè)置為lecture_id。當(dāng)面對(duì)多事實(shí)表時(shí),先進(jìn)行 Colocation Join ,再進(jìn)行維度 Bucket Shuffle Join ,以實(shí)現(xiàn)快速查詢響應(yīng)。而使用這個(gè)方式可能導(dǎo)致以下問題:當(dāng)選取的 lecture_id 進(jìn)行DISTRIBUTED BY時(shí),數(shù)據(jù)庫(kù)主鍵 ID 并不是均勻分布的,在數(shù)據(jù)量很大的情況下可能會(huì)導(dǎo)致數(shù)據(jù)傾斜,而各個(gè)機(jī)器的 Tablet 大小不一致,在高并發(fā)查詢時(shí)可能出現(xiàn) BE 機(jī)器資源使用不均衡,從而影響查詢穩(wěn)定性,造成資源浪費(fèi)。

基于以上問題,我們嘗試進(jìn)行調(diào)整,并對(duì)查詢效率和機(jī)器資源的占用這兩方面進(jìn)行了評(píng)估權(quán)衡,最終決定在盡量不影響查詢效率的前提下,盡可能提高資源利用率。在資源利用上,我們?cè)诮ū頃r(shí)利用colocate_with屬性,在不同數(shù)量和類型的 Distributed Key 創(chuàng)建不同的 Group,實(shí)現(xiàn)機(jī)器資源能得以充分利用。

在查詢效率上,根據(jù)業(yè)務(wù)場(chǎng)景和需求對(duì)前綴索引的字段順序進(jìn)行針對(duì)性調(diào)整,對(duì)于必選或高頻的查詢條件,將字段放在 UNIQUE KEY 前面,根據(jù)維度按照從高到低的順序進(jìn)行設(shè)計(jì)。其次我們利用物化視圖對(duì)字段順序進(jìn)行調(diào)整,盡可能使用前綴索引進(jìn)行查詢,以加快數(shù)據(jù)查詢 。除此之外,我們對(duì)數(shù)據(jù)量進(jìn)行月、天分區(qū),對(duì)明細(xì)數(shù)據(jù)進(jìn)行分桶,通過合理庫(kù)表的設(shè)計(jì)減少 FE 元數(shù)據(jù)的壓力。

數(shù)據(jù)管理

在數(shù)據(jù)管理方面,我們進(jìn)行了以下操作:

·監(jiān)控告警:對(duì)于重要的單表,我們一般通過 騰訊云數(shù)據(jù)倉(cāng)庫(kù) Doris 來創(chuàng)建外部表,通過數(shù)據(jù)質(zhì)量監(jiān)控來對(duì)比業(yè)務(wù)庫(kù)數(shù)據(jù)和 Doris 數(shù)據(jù),進(jìn)行數(shù)據(jù)質(zhì)量稽查告警。

·數(shù)據(jù)備份與恢復(fù):我們會(huì)將 Doris 數(shù)據(jù)定期導(dǎo)入到 HDFS 進(jìn)行備份,避免數(shù)據(jù)誤刪除或丟失的情況發(fā)生。比如當(dāng)因某些原因?qū)е?Flink 同步任務(wù)失敗、無法從 Checkpoint 進(jìn)行啟動(dòng)時(shí),我們可讀取最新的數(shù)據(jù)進(jìn)行同步,歷史缺失數(shù)據(jù)通過外部表進(jìn)行修復(fù),使得同步任務(wù)能夠快速恢復(fù)。

六、收益總結(jié)

在新架構(gòu)中我們從 Hadoop 生態(tài)完全地遷移到 Flink + Doris 上,在上層構(gòu)建不同的數(shù)據(jù)應(yīng)用,比如自助報(bào)表、自助數(shù)據(jù)提取、數(shù)據(jù)大屏、業(yè)務(wù)預(yù)警等,Doris 通過應(yīng)用層接口服務(wù)項(xiàng)目統(tǒng)一對(duì)外提供 API 查詢,新架構(gòu)的應(yīng)用也為我們帶來了許多收益:支撐了荔枝微課內(nèi)部 90% 以上的業(yè)務(wù)場(chǎng)景,整體可達(dá)到毫秒級(jí)的查詢響應(yīng)。

·支持千萬級(jí)甚至億級(jí)大表關(guān)聯(lián)查詢,可實(shí)現(xiàn)秒級(jí)甚至毫秒級(jí)響應(yīng)。

·Doris 統(tǒng)一了數(shù)據(jù)源出口,查詢效率顯著提升,支持多種數(shù)據(jù)的聯(lián)邦查詢,降低了多數(shù)據(jù)查詢的復(fù)雜度以及數(shù)據(jù)鏈路處理成本。

·Doris 架構(gòu)簡(jiǎn)單,極大簡(jiǎn)化了大數(shù)據(jù)的架構(gòu)體系;并高度兼容 MySQL 的語(yǔ)法,極大降低開發(fā)人員接入成本。

七、未來規(guī)劃

荔枝微課在引入騰訊云數(shù)據(jù)倉(cāng)庫(kù) Doris 之后,在內(nèi)部得到了非常廣泛的應(yīng)用,滿足了各業(yè)務(wù)場(chǎng)景需求、實(shí)現(xiàn)降本提效,深得十方融海各數(shù)據(jù)部門高度認(rèn)可。未來我們期待 騰訊云數(shù)據(jù)倉(cāng)庫(kù) Doris在實(shí)時(shí)數(shù)據(jù)處理場(chǎng)景的能力上有更進(jìn)一步的提升,包括 Unique 模型上的部分列更新、單表物化視圖上的計(jì)算增強(qiáng)、自動(dòng)增量刷新的多表物化視圖等,通過不斷的迭代更新,使實(shí)時(shí)數(shù)倉(cāng)的構(gòu)建更加簡(jiǎn)單易用。最后,感謝騰訊云大數(shù)據(jù)和selectDB團(tuán)隊(duì),感謝其對(duì)問題的快速響應(yīng)和積極的技術(shù)支持。同時(shí),騰訊云也將不斷打磨產(chǎn)品,探索惠及更多行業(yè)場(chǎng)景的云端實(shí)踐之路。

舉報(bào) 0 收藏 0 打賞 0評(píng)論 0
 
 
更多>同類資訊
全站最新
熱門內(nèi)容
網(wǎng)站首頁(yè)  |  關(guān)于我們  |  聯(lián)系方式  |  版權(quán)聲明  |  網(wǎng)站留言  |  RSS訂閱  |  違規(guī)舉報(bào)  |  開放轉(zhuǎn)載  |  滾動(dòng)資訊  |  English Version