CMU15-445 數(shù)據(jù)庫系統(tǒng)播客:海量數(shù)據(jù)場(chǎng)景下的分布式 OLAP
在數(shù)據(jù)如潮水般涌來的今天,如何從PB級(jí)的歷史數(shù)據(jù)中高效地挖掘商業(yè)洞見,已成為企業(yè)在激烈競(jìng)爭(zhēng)中脫穎而出的關(guān)鍵。在線分析處理(OLAP)數(shù)據(jù)庫系統(tǒng)正是為此而生。它并非為處理高并發(fā)的日常交易(OLTP)而設(shè)計(jì),而是專為運(yùn)行復(fù)雜分析查詢、駕馭海量數(shù)據(jù)集的“巨獸”。
本文將帶您深入分布式 OLAP 數(shù)據(jù)庫的內(nèi)部,從核心數(shù)據(jù)模型到復(fù)雜的分布式查詢執(zhí)行,揭示其高性能背后的設(shè)計(jì)哲學(xué)與關(guān)鍵技術(shù)。
為何需要 OLAP 與 ETL?
OLAP 系統(tǒng)的核心使命是 事后分析(Post-hoc Analysis) 。它分析的是已經(jīng)發(fā)生并沉淀下來的歷史數(shù)據(jù),旨在發(fā)現(xiàn)趨勢(shì)、識(shí)別模式,從而為未來的商業(yè)決策提供數(shù)據(jù)支持。
這些數(shù)據(jù)通常源于企業(yè)前端的多個(gè) OLTP 數(shù)據(jù)庫。例如,像《糖果傳奇》這樣的游戲,玩家的每一次點(diǎn)擊、道具購買都是一個(gè) OLTP 事務(wù),被實(shí)時(shí)記錄下來。但要分析“玩家通常在哪個(gè)關(guān)卡流失”或“哪種道具組合最受歡迎”,就需要將這些海量的“點(diǎn)擊流”數(shù)據(jù)整合到一個(gè)統(tǒng)一的分析平臺(tái)。
這便引出了 ETL(Extract, Transform, Load) 過程:
- 抽取 (Extract) :從各個(gè) OLTP 源數(shù)據(jù)庫(如用戶庫、訂單庫)中抽取數(shù)據(jù)。
- 轉(zhuǎn)換 (Transform) :清洗、整合和規(guī)范化數(shù)據(jù)。比如,將一個(gè)庫中的
Fname字段和另一個(gè)庫的first_name字段統(tǒng)一為標(biāo)準(zhǔn)的FirstName。 - 加載 (Load) :將處理好的數(shù)據(jù)加載到目標(biāo)數(shù)據(jù)倉庫(即 OLAP 數(shù)據(jù)庫)中。
通過 ETL,企業(yè)可以構(gòu)建一個(gè)統(tǒng)一、干凈的數(shù)據(jù)視圖。決策支持系統(tǒng)(DSS)或機(jī)器學(xué)習(xí)模型在此基礎(chǔ)上運(yùn)行,就能洞察用戶行為。就像游戲公司發(fā)現(xiàn)玩家在某一關(guān)卡頻繁受挫后,可以在他們下次登錄時(shí)提供一個(gè)更簡(jiǎn)單的版本,以此 重新吸引并留住玩家 ,最終提升商業(yè)價(jià)值。
星型模式與雪花型模式
為了極致的查詢性能,OLAP 數(shù)據(jù)庫摒棄了 OLTP 系統(tǒng)中高度規(guī)范化的表結(jié)構(gòu),轉(zhuǎn)而采用為分析優(yōu)化的數(shù)據(jù)模型。最經(jīng)典的就是 星型模式(Star Schema) 和 雪花型模式(Snowflake Schema) 。
星型模式 (Star Schema)
這是 OLAP 中最常見的模型,其結(jié)構(gòu)形如其名——一個(gè)中心,眾星環(huán)繞。
- 事實(shí)表 (Fact Table) :位于中心的“恒星”,存儲(chǔ)著業(yè)務(wù)事件的核心度量數(shù)據(jù)(Measures),如銷售額、銷量、點(diǎn)擊次數(shù)。事實(shí)表通常極為龐大,可能包含數(shù)百億甚至數(shù)萬億行記錄(想象一下亞馬遜或沃爾瑪?shù)拿恳还P商品掃描記錄)。它通過外鍵連接到周圍的維度表。
- 維度表 (Dimension Tables) :環(huán)繞在事實(shí)表周圍的“行星”,提供事件的上下文信息(Context),如時(shí)間、地點(diǎn)、產(chǎn)品詳情、客戶信息等。在嚴(yán)格的星型模式中, 維度表是反規(guī)范化的,只有一層,不允許再關(guān)聯(lián)到其他表 。
優(yōu)勢(shì) | 劣勢(shì) |
查詢性能極高:查詢通常只需要一次事實(shí)表與多個(gè)維度表的聯(lián)結(jié),避免了復(fù)雜的多層 | 數(shù)據(jù)冗余:為了避免聯(lián)結(jié),維度表可能包含重復(fù)信息(例如,產(chǎn)品維度表同時(shí)存儲(chǔ)了品類ID和品類名稱)。 |
結(jié)構(gòu)簡(jiǎn)單直觀:業(yè)務(wù)分析人員更容易理解數(shù)據(jù)模型并構(gòu)建查詢。 | 維護(hù)成本稍高:數(shù)據(jù)更新時(shí)可能需要修改多處,存在一致性風(fēng)險(xiǎn)。 |
在 OLAP 場(chǎng)景下,查詢性能是第一要?jiǎng)?wù),維度表帶來的冗余存儲(chǔ)與事實(shí)表相比微不足道,因此星型模式廣受歡迎。
雪花型模式 (Snowflake Schema)
雪花型模式是星型模式的變體,它對(duì)維度表進(jìn)行了進(jìn)一步的 規(guī)范化 ,維度表可以再關(guān)聯(lián)到其他更細(xì)粒度的維度表,結(jié)構(gòu)如同雪花般展開。
- 設(shè)計(jì)理念 :例如,產(chǎn)品維度表
PRODUCT_DIM可能只存儲(chǔ)品類ID,然后通過這個(gè)ID去關(guān)聯(lián)一個(gè)專門的CATEGORY_LOOKUP表來獲取品類的具體名稱。
優(yōu)勢(shì) | 劣勢(shì) |
存儲(chǔ)效率更高:通過規(guī)范化減少了數(shù)據(jù)冗余,節(jié)省了存儲(chǔ)空間。 | 查詢性能更低:獲取完整的上下文信息需要進(jìn)行更多的 |
數(shù)據(jù)一致性好:更新數(shù)據(jù)時(shí)只需修改一處,更容易維護(hù)。 | 模型復(fù)雜度高:對(duì)于分析人員來說,理解數(shù)據(jù)關(guān)系和構(gòu)建查詢變得更加困難。 |
在現(xiàn)代 OLAP 系統(tǒng)中,星型模式因其無與倫比的查詢性能而占據(jù)主導(dǎo)地位。
分布式執(zhí)行:將計(jì)算推向數(shù)據(jù)
當(dāng)數(shù)據(jù)量增長到單臺(tái)機(jī)器無法承載時(shí),分布式架構(gòu)成為必然選擇。在分布式環(huán)境中,如何執(zhí)行查詢,尤其是如何處理數(shù)據(jù)的移動(dòng),是決定性能的命脈。
- “推”模型 (Push Model) :這是 無共享 (Shared-Nothing) 架構(gòu)的典型范式。其核心思想是 將計(jì)算邏輯推送到數(shù)據(jù)所在的節(jié)點(diǎn)執(zhí)行 。協(xié)調(diào)節(jié)點(diǎn)會(huì)將查詢計(jì)劃分解成多個(gè)片段,并將這些片段發(fā)送到存儲(chǔ)著相關(guān)數(shù)據(jù)的各個(gè)工作節(jié)點(diǎn)。工作節(jié)點(diǎn)在本地進(jìn)行數(shù)據(jù)過濾、聚合和計(jì)算,然后只將精簡(jiǎn)后的中間結(jié)果返回給協(xié)調(diào)節(jié)點(diǎn)。這種方式 最大化地減少了網(wǎng)絡(luò)數(shù)據(jù)傳輸 ,實(shí)現(xiàn)了卓越的并行處理能力。
- “拉”模型 (Pull Model) :常見于 共享磁盤 (Shared-Disk) 架構(gòu)。查詢執(zhí)行節(jié)點(diǎn)根據(jù)需要,從遠(yuǎn)程的共享存儲(chǔ)中“拉取”數(shù)據(jù)頁到本地內(nèi)存進(jìn)行處理。
如今,這兩種模型的界限正在變得模糊。例如,Amazon S3 等現(xiàn)代云對(duì)象存儲(chǔ)已經(jīng)支持 謂詞下推(Predicate Pushdown) 。這意味著即使是“拉”取數(shù)據(jù)的系統(tǒng),也可以先在存儲(chǔ)層執(zhí)行簡(jiǎn)單的過濾操作,只拉取真正需要的數(shù)據(jù),從而實(shí)現(xiàn)了“計(jì)算靠近數(shù)據(jù)”的效果。
性能至上:為何 OLAP 查詢通常“不容錯(cuò)”?
一個(gè)復(fù)雜的 OLAP 查詢可能會(huì)運(yùn)行數(shù)小時(shí)甚至數(shù)天。如果在此期間某個(gè)計(jì)算節(jié)點(diǎn)發(fā)生故障,查詢?cè)摵稳ズ螐模?/span>
你可能會(huì)驚訝地發(fā)現(xiàn),大多數(shù)高性能的分布式 OLAP 數(shù)據(jù)庫都 不提供查詢級(jí)別的容錯(cuò)(Query Fault Tolerance) 。換言之,如果一個(gè)節(jié)點(diǎn)宕機(jī),整個(gè)查詢會(huì)立即失敗并中止,用戶必須重新提交。
這背后的邏輯是 性能與成本的極致權(quán)衡 :
- 性能是王道:要實(shí)現(xiàn)查詢?nèi)蒎e(cuò),系統(tǒng)必須在執(zhí)行過程中頻繁地為中間結(jié)果創(chuàng)建快照(Snapshot)并持久化到磁盤。磁盤I/O的開銷是巨大的,這會(huì)嚴(yán)重拖慢原本就耗時(shí)很長的查詢。
- 硬件的可靠性假設(shè):傳統(tǒng)的數(shù)據(jù)倉庫通常部署在昂貴且高度可靠的硬件上,節(jié)點(diǎn)故障被視為小概率事件。為了追求極致的查詢性能,系統(tǒng)設(shè)計(jì)者寧愿接受“失敗重跑”的風(fēng)險(xiǎn)。
注意:這與數(shù)據(jù)庫的 日志與恢復(fù)(Logging & Recovery) 機(jī)制是兩個(gè)完全不同的概念。后者用于保證已提交事務(wù)的 持久性(Durability) ,確保系統(tǒng)崩潰后數(shù)據(jù)不會(huì)丟失,而查詢?nèi)蒎e(cuò)關(guān)心的是保障一個(gè) 正在運(yùn)行中 的長時(shí)間查詢不因節(jié)點(diǎn)故障而中斷。
核心難題:分布式聯(lián)結(jié)(Join)的四大策略
在分布式數(shù)據(jù)庫中,JOIN 依然是開銷最大、也最重要的操作。其根本挑戰(zhàn)在于: 如何以最小的代價(jià),將需要聯(lián)結(jié)的數(shù)據(jù)匯集到同一個(gè)計(jì)算節(jié)點(diǎn)上 。
以下是四種典型的分布式聯(lián)結(jié)場(chǎng)景和應(yīng)對(duì)策略:
場(chǎng)景 1: 復(fù)制表聯(lián)結(jié) (Replicated Join) - 最佳情況
- 描述 :一張表(通常是較小的維度表)在集群的 每個(gè)節(jié)點(diǎn)上都有一份完整的副本 。
- 策略 :每個(gè)節(jié)點(diǎn)都可以在本地獨(dú)立地完成大表分區(qū)與小表完整副本的
JOIN操作,無需任何跨節(jié)點(diǎn)數(shù)據(jù)傳輸。最后只需將各自的結(jié)果匯總。 - 評(píng)價(jià) :這是最高效的分布式聯(lián)結(jié)方式,實(shí)現(xiàn)了完美的并行計(jì)算。
場(chǎng)景 2: 共置聯(lián)結(jié) (Co-located Join) - 理想情況
- 描述 :兩張待聯(lián)結(jié)的表都按照 相同的聯(lián)結(jié)鍵(Join Key)進(jìn)行了分區(qū) ,并且鍵值范圍相同的分區(qū)存儲(chǔ)在同一個(gè)節(jié)點(diǎn)上。
- 策略 :與場(chǎng)景1類似,每個(gè)節(jié)點(diǎn)都可以在本地獨(dú)立地處理其擁有的數(shù)據(jù)分區(qū),完成
JOIN。 - 評(píng)價(jià) :同樣是效率極高的方式。但需警惕 數(shù)據(jù)傾斜(Data Skew) 問題,即某個(gè)分區(qū)的數(shù)據(jù)量遠(yuǎn)超其他分區(qū),導(dǎo)致該節(jié)點(diǎn)成為性能瓶頸。
場(chǎng)景 3: 廣播聯(lián)結(jié) (Broadcast Join)
- 描述 :兩張表分區(qū)方式不同,但其中一張表相對(duì)較小。
- 策略 :將那張 較小的表完整地廣播(Broadcast) 到集群中所有參與計(jì)算的節(jié)點(diǎn)。這樣,每個(gè)節(jié)點(diǎn)就都有了小表的全量數(shù)據(jù)和大表的部分?jǐn)?shù)據(jù),從而可以執(zhí)行本地
JOIN。 - 前提 :小表必須足夠小,能夠完全加載到每個(gè)節(jié)點(diǎn)的內(nèi)存中,且網(wǎng)絡(luò)開銷可以接受。
場(chǎng)景 4: 重分區(qū)/洗牌聯(lián)結(jié) (Shuffle Join) - 最差情況
- 描述 :兩張表都很大,且沒有按照聯(lián)結(jié)鍵進(jìn)行分區(qū)。
- 策略 :這是萬不得已的最終手段。系統(tǒng)必須在運(yùn)行時(shí) 動(dòng)態(tài)地對(duì)兩張表按聯(lián)結(jié)鍵進(jìn)行重新分區(qū)和數(shù)據(jù)重分布(即“洗牌” Shuffle) 。例如,將兩張表中所有
user_id在 1-1000 范圍內(nèi)的數(shù)據(jù)都發(fā)送到節(jié)點(diǎn)A,1001-2000 的發(fā)送到節(jié)點(diǎn)B,以此類推。數(shù)據(jù)“洗牌”完成后,每個(gè)節(jié)點(diǎn)才能開始執(zhí)行本地JOIN。 - 評(píng)價(jià) :此方法涉及 大規(guī)模的網(wǎng)絡(luò)數(shù)據(jù)傳輸 和可能的磁盤溢寫, 成本最高,性能最差 。
優(yōu)化技巧:半聯(lián)結(jié) (Semi-Join)為了減少數(shù)據(jù)移動(dòng),系統(tǒng)常使用半聯(lián)結(jié)。它先將一個(gè)表中的聯(lián)結(jié)鍵發(fā)送到另一個(gè)表所在的位置,進(jìn)行過濾,只取回能成功匹配的記錄,從而在執(zhí)行正式的
JOIN之前就大大減少了需要傳輸?shù)臄?shù)據(jù)量。
從以上場(chǎng)景可以看出,OLAP 數(shù)據(jù)庫設(shè)計(jì)中一個(gè) 至關(guān)重要的決策就是選擇分區(qū)鍵(Partitioning Key) 。一個(gè)優(yōu)秀的分區(qū)策略能讓絕大多數(shù) JOIN 變?yōu)楦咝У摹肮仓寐?lián)結(jié)”,從而避免昂貴的“廣播”和“洗牌”。
云時(shí)代的演進(jìn):云原生、無服務(wù)器與開放格式
云技術(shù)正在深刻地重塑 OLAP 數(shù)據(jù)庫的形態(tài)。
- 云原生數(shù)據(jù)庫 (Cloud-Native DBMS) :像 Amazon Redshift , Snowflake , Google BigQuery 等系統(tǒng)是為云而生的。它們通常采用計(jì)算與存儲(chǔ)分離的架構(gòu),能夠充分利用云平臺(tái)(如 S3)提供的彈性、高可用和低成本的存儲(chǔ)基礎(chǔ)設(shè)施。
- 無服務(wù)器數(shù)據(jù)庫 (Serverless Databases) :這是云原生理念的進(jìn)一步延伸。當(dāng)沒有查詢時(shí),計(jì)算資源可以完全“休眠”甚至關(guān)閉,用戶只需為數(shù)據(jù)存儲(chǔ)付費(fèi)。當(dāng)新查詢到來時(shí),系統(tǒng)會(huì)秒級(jí)啟動(dòng)計(jì)算實(shí)例并執(zhí)行任務(wù),真正實(shí)現(xiàn)了 按需付費(fèi) 。
- 通用文件格式 (Universal Formats) :傳統(tǒng)數(shù)據(jù)庫專有的二進(jìn)制文件格式造成了“數(shù)據(jù)孤島”。為了打破壁壘,業(yè)界誕生了多種開源的列式存儲(chǔ)文件格式。
a.Apache Parquet & Apache ORC : 目前最主流的兩種磁盤持久化列式存儲(chǔ)格式,自帶壓縮和編碼優(yōu)化。
b.Apache Arrow : 一種為 內(nèi)存中(in-memory) 數(shù)據(jù)設(shè)計(jì)的跨語言列式格式,旨在實(shí)現(xiàn)不同系統(tǒng)和工具間零拷貝、高效率的數(shù)據(jù)交換。
這些開放格式使得數(shù)據(jù)可以在不同的分析引擎(如 Spark, Presto, DuckDB)和數(shù)據(jù)庫系統(tǒng)之間無縫共享,無需進(jìn)行昂貴且耗時(shí)的 ETL 轉(zhuǎn)換。
總結(jié)
海量數(shù)據(jù)分析無疑帶來了更多挑戰(zhàn),但分布式 OLAP 數(shù)據(jù)庫技術(shù)的發(fā)展為我們提供了強(qiáng)大的武器。從為分析而生的星型數(shù)據(jù)模型,到“計(jì)算推向數(shù)據(jù)”的分布式執(zhí)行哲學(xué),再到對(duì)不同聯(lián)結(jié)場(chǎng)景的精妙處理,所有設(shè)計(jì)的核心都指向一個(gè)共同的目標(biāo): 盡可能減少數(shù)據(jù)移動(dòng) 。
隨著云原生架構(gòu)和開放數(shù)據(jù)格式的普及,現(xiàn)代 OLAP 系統(tǒng)正變得前所未有的強(qiáng)大、靈活和經(jīng)濟(jì)高效。無論是商業(yè)巨頭 Snowflake、Redshift,還是開源新星 ClickHouse、DuckDB,理解它們背后的核心原理,都將幫助你更好地駕馭數(shù)據(jù)洪流,從中發(fā)掘價(jià)值。





































