阿里巴巴大数据实践—实时技术
來(lái)源:數(shù)智化轉(zhuǎn)型俱樂(lè)部
數(shù)據(jù)價(jià)值是具有時(shí)效性的,在一條數(shù)據(jù)產(chǎn)生的時(shí)候,如果不能及時(shí)處理并在業(yè)務(wù)系統(tǒng)中使用,就不能讓數(shù)據(jù)保持最高的“新鮮度”和價(jià)值最大化。
相對(duì)于離線批處理技術(shù),流式實(shí)時(shí)處理技術(shù)作為一個(gè)非常重要的技術(shù)補(bǔ)充,在阿里巴巴集團(tuán)內(nèi)被廣泛使用。
在大數(shù)據(jù)業(yè)界中,流計(jì)算技術(shù)的研究是近年來(lái)非常熱門的課題。
業(yè)務(wù)訴求是希望能在第一時(shí)間拿到經(jīng)過(guò)加工后的數(shù)據(jù),以便實(shí)時(shí)監(jiān)控當(dāng)前業(yè)務(wù)狀態(tài)并做出運(yùn)營(yíng)決策,引導(dǎo)業(yè)務(wù)往好的方向發(fā)展。比如網(wǎng)站上一個(gè)訪問(wèn)量很高的廣告位,需要實(shí)時(shí)監(jiān)控廣告位的引流效果,如果轉(zhuǎn)化率非常低的話,運(yùn)營(yíng)人員就需要及時(shí)更換為其他廣告,以避免流量資源的浪費(fèi)。在這個(gè)例子中,就需要實(shí)時(shí)統(tǒng)計(jì)廣告位的曝光和點(diǎn)擊等指標(biāo)作為運(yùn)營(yíng)決策的參考。
按照數(shù)據(jù)的延遲情況,數(shù)據(jù)時(shí)效性一般分為三種(離線、準(zhǔn)實(shí)時(shí)、實(shí)時(shí)):
- 離線:在今天(T)處理N天前(T-N,N≥1)的數(shù)據(jù),延遲時(shí)間粒度為天。
- 準(zhǔn)實(shí)時(shí):在當(dāng)前小時(shí)(H)處理N小時(shí)前(H-N,N>0,如0.5小時(shí)、1小時(shí)等)的數(shù)據(jù),延遲時(shí)間粒度為小時(shí)。
- 實(shí)時(shí):在當(dāng)前時(shí)刻處理當(dāng)前的數(shù)據(jù),延遲時(shí)間粒度為秒;
離線和準(zhǔn)實(shí)時(shí)都可以在批處理系統(tǒng)中實(shí)現(xiàn)(比如Hadoop、MaxCompute、Spark等系統(tǒng)),只是調(diào)度周期不一樣而已,而實(shí)時(shí)數(shù)據(jù)則需要在流式處理系統(tǒng)中完成。簡(jiǎn)單來(lái)說(shuō),流式數(shù)據(jù)處理技術(shù)是指業(yè)務(wù)系統(tǒng)每產(chǎn)生一條數(shù)據(jù),就會(huì)立刻被采集并實(shí)時(shí)發(fā)送到流式任務(wù)中進(jìn)行處理,不需要定時(shí)調(diào)度任務(wù)來(lái)處理數(shù)據(jù)。
整體來(lái)看,流式數(shù)據(jù)處理一般具有以下特征。
1.時(shí)效性高
數(shù)據(jù)實(shí)時(shí)采集、實(shí)時(shí)處理,延時(shí)粒度在秒級(jí)甚至毫秒級(jí),業(yè)務(wù)方能夠在第一時(shí)間拿到經(jīng)過(guò)加工處理后的數(shù)據(jù)。
2.常駐任務(wù)
區(qū)別于離線任務(wù)的周期調(diào)度,流式任務(wù)屬于常駐進(jìn)程任務(wù),一旦啟動(dòng)后就會(huì)一直運(yùn)行,直到人為地終止,因此計(jì)算成本會(huì)相對(duì)比較高。這一特點(diǎn)也預(yù)示著流式任務(wù)的數(shù)據(jù)源是無(wú)界的,而離線任務(wù)的數(shù)據(jù)源是有界的。這也是實(shí)時(shí)處理和離線處理最主要的差別,這個(gè)特性會(huì)導(dǎo)致實(shí)時(shí)任務(wù)在數(shù)據(jù)處理上有一定的局限性。
3.性能要求高
實(shí)時(shí)計(jì)算對(duì)數(shù)據(jù)處理的性能要求非常嚴(yán)格,如果處理吞吐量跟不上采集吞吐量,計(jì)算出來(lái)的數(shù)據(jù)就失去了實(shí)時(shí)的特性。比如實(shí)時(shí)任務(wù)1分鐘只能處理30秒采集的數(shù)據(jù),那么產(chǎn)出的數(shù)據(jù)的延時(shí)會(huì)越來(lái)越長(zhǎng),不能代表當(dāng)前時(shí)刻的業(yè)務(wù)狀態(tài),有可能導(dǎo)致業(yè)務(wù)方做出錯(cuò)誤的運(yùn)營(yíng)決策。在互聯(lián)網(wǎng)行業(yè)中,需要處理的數(shù)據(jù)是海量的,如何在數(shù)據(jù)量快速膨脹的情況下也能保持高吞吐量和低延時(shí),是當(dāng)前面臨的重要挑戰(zhàn)。因此,實(shí)時(shí)處理的性能優(yōu)化占了任務(wù)開(kāi)發(fā)的很大一部分工作。
4.應(yīng)用局限性
實(shí)時(shí)數(shù)據(jù)處理不能替代離線處理,除了計(jì)算成本較大這個(gè)因素外,對(duì)于業(yè)務(wù)邏輯復(fù)雜的場(chǎng)景(比如雙流關(guān)聯(lián)或者需要數(shù)據(jù)回滾的情況),其局限性導(dǎo)致支持不足。另外,由于數(shù)據(jù)源是流式的,在數(shù)據(jù)具有上下文關(guān)系的情況下,數(shù)據(jù)到達(dá)時(shí)間的不確定性導(dǎo)致實(shí)時(shí)處理跟離線處理得出來(lái)的結(jié)果會(huì)有一定的差異。
流式技術(shù)架構(gòu)
在流式計(jì)算技術(shù)中,需要各個(gè)子系統(tǒng)之間相互依賴形成一條數(shù)據(jù)處理鏈路,才能產(chǎn)出結(jié)果最終對(duì)外提供實(shí)時(shí)數(shù)據(jù)服務(wù)。在實(shí)際技術(shù)選型時(shí),可選的開(kāi)源技術(shù)方案非常多,但是各個(gè)方案的整體架構(gòu)是類似的,只是各個(gè)子系統(tǒng)的實(shí)現(xiàn)原理不太一樣。另外,流式技術(shù)架構(gòu)中的系統(tǒng)跟離線處理是有交叉的,兩套技術(shù)方案并不是完全獨(dú)立的,并且在業(yè)界中有合并的趨勢(shì)。
各個(gè)子系統(tǒng)按功能劃分的話,主要分為以下幾部分:
1.數(shù)據(jù)采集
數(shù)據(jù)的源頭,一般來(lái)自于各個(gè)業(yè)務(wù)的日志服務(wù)器(例如網(wǎng)站的瀏覽行為日志、訂單的修改日志等),這些數(shù)據(jù)被實(shí)時(shí)采集到數(shù)據(jù)中間件中,供下游實(shí)時(shí)訂閱使用。
2.數(shù)據(jù)處理
數(shù)據(jù)被采集到中間件中后,需要下游實(shí)時(shí)訂閱數(shù)據(jù),并拉取到流式計(jì)算系統(tǒng)的任務(wù)中進(jìn)行加工處理。這里需要提供流計(jì)算引擎以支持流式任務(wù)的執(zhí)行。
**3.數(shù)據(jù)存儲(chǔ)
**
數(shù)據(jù)被實(shí)時(shí)加工處理(比如聚合、清洗等)后,會(huì)寫到某個(gè)在線服務(wù)的存儲(chǔ)系統(tǒng)中,供下游調(diào)用方使用。這里的寫操作是增量操作,并且是源源不斷的。
4.數(shù)據(jù)服務(wù)
在存儲(chǔ)系統(tǒng)上會(huì)架設(shè)一層統(tǒng)一的數(shù)據(jù)服務(wù)層(比如提供HSF接口、HTTP服務(wù)等),用于獲取實(shí)時(shí)計(jì)算結(jié)果。
整體技術(shù)架構(gòu)如圖所示:
從圖可以看出,在數(shù)據(jù)采集和數(shù)據(jù)服務(wù)部分實(shí)時(shí)和離線是公用的,因?yàn)樵谶@兩層中都不需要關(guān)心數(shù)據(jù)的時(shí)效性。這樣才能做到數(shù)據(jù)源的統(tǒng)一,避免流式處理和離線處理的不一致。
流式數(shù)據(jù)模型
在流式計(jì)算技術(shù)中,需要各個(gè)子系統(tǒng)之間相互依賴形成一條數(shù)據(jù)處理鏈路,才能產(chǎn)出結(jié)果最終對(duì)外提供實(shí)時(shí)數(shù)據(jù)服務(wù)。在實(shí)際技術(shù)選型時(shí),可選的開(kāi)源技術(shù)方案非常多,但是各個(gè)方案的整體架構(gòu)是類似的,只是各個(gè)子系統(tǒng)的實(shí)現(xiàn)原理不太一樣。另外,流式技術(shù)架構(gòu)中的系統(tǒng)跟離線處理是有交叉的,兩套技術(shù)方案并不是完全獨(dú)立的,并且在業(yè)界中有合并的趨勢(shì)。
各個(gè)子系統(tǒng)按功能劃分的話,主要分為以下幾部分:
數(shù)據(jù)模型設(shè)計(jì)是貫通數(shù)據(jù)處理過(guò)程的,流式數(shù)據(jù)處理也一樣,需要對(duì)數(shù)據(jù)流建模分層。實(shí)時(shí)建模跟離線建模非常類似,數(shù)據(jù)模型整體上分為五層(ODS、DWD、DWS、ADS、DIM)。
由于實(shí)時(shí)計(jì)算的局限性,每一層中并沒(méi)有像離線做得那么寬,維度和指標(biāo)也沒(méi)有那么多,特別是涉及回溯狀態(tài)的指標(biāo),在實(shí)時(shí)數(shù)據(jù)模型中幾乎沒(méi)有。
整體來(lái)看,實(shí)時(shí)數(shù)據(jù)模型是離線數(shù)據(jù)模型的一個(gè)子集,在實(shí)時(shí)數(shù)據(jù)處理過(guò)程中,很多模型設(shè)計(jì)就是參考離線數(shù)據(jù)模型實(shí)現(xiàn)的。
1.數(shù)據(jù)分層
在流式數(shù)據(jù)模型中,數(shù)據(jù)模型整體上分為五層。
ODS層:跟離線系統(tǒng)的定義一樣,ODS層屬于操作數(shù)據(jù)層,是直接從業(yè)務(wù)系統(tǒng)采集過(guò)來(lái)的最原始數(shù)據(jù),包含了所有業(yè)務(wù)的變更過(guò)程,數(shù)據(jù)粒度也是最細(xì)的。在這一層,實(shí)時(shí)和離線在源頭上是統(tǒng)一的,這樣的好處是用同一份數(shù)據(jù)加工出來(lái)的指標(biāo),口徑基本是統(tǒng)一的,可以更方便進(jìn)行實(shí)時(shí)和離線間數(shù)據(jù)比對(duì)。例如:原始的訂單變更記錄數(shù)據(jù)、服務(wù)器引擎的訪問(wèn)日志。
DWD層:DWD層是在ODS層基礎(chǔ)上,根據(jù)業(yè)務(wù)過(guò)程建模出來(lái)的實(shí)時(shí)事實(shí)明細(xì)層,對(duì)于訪問(wèn)日志這種數(shù)據(jù)(沒(méi)有上下文關(guān)系,并且不需要等待過(guò)程的記錄),會(huì)回流到離線系統(tǒng)供下游使用,最大程度地保證實(shí)時(shí)和離線數(shù)據(jù)在ODS層和DWD層是一致的。例如:訂單的支付明細(xì)表、退款明細(xì)表、用戶的訪問(wèn)日志明細(xì)表。
DWS層:訂閱明細(xì)層的數(shù)據(jù)后,會(huì)在實(shí)時(shí)任務(wù)中計(jì)算各個(gè)維度的匯總指標(biāo)。如果維度是各個(gè)垂直業(yè)務(wù)線通用的,則會(huì)放在實(shí)時(shí)通用匯總層,作為通用的數(shù)據(jù)模型使用。比如電商網(wǎng)站的賣家粒度,只要涉及交易過(guò)程,就會(huì)跟這個(gè)維度相關(guān),所以賣家維度是各個(gè)垂直業(yè)務(wù)的通用維度,其中的匯總指標(biāo)也是各個(gè)業(yè)務(wù)線共用的。例如:電商數(shù)據(jù)的幾大維度的匯總表(賣家、商品、買家)。
ADS層:個(gè)性化維度匯總層,對(duì)于不是特別通用的統(tǒng)計(jì)維度數(shù)據(jù)會(huì)放在這一層中,這里計(jì)算只有自身業(yè)務(wù)才會(huì)關(guān)注的維度和指標(biāo),跟其他業(yè)務(wù)線一般沒(méi)有交集,常用于一些垂直創(chuàng)新業(yè)務(wù)中。例如:手機(jī)淘寶下面的某個(gè)愛(ài)逛街、微淘等垂直業(yè)務(wù)。
DIM層:實(shí)時(shí)維表層的數(shù)據(jù)基本上都是從離線維表層導(dǎo)出來(lái)的,抽取到在線系統(tǒng)中供實(shí)時(shí)應(yīng)用調(diào)用。這一層對(duì)實(shí)時(shí)應(yīng)用來(lái)說(shuō)是靜態(tài)的,所有的ETL處理工作會(huì)在離線系統(tǒng)中完成。維表在實(shí)時(shí)應(yīng)用的使用中跟離線稍有區(qū)別,后面章節(jié)中會(huì)詳細(xì)說(shuō)明。例如:商品維表、賣家維表、買家維表、類目維表。
2.多流關(guān)聯(lián)
在流式計(jì)算中常常需要把兩個(gè)實(shí)時(shí)流進(jìn)行主鍵關(guān)聯(lián),以得到對(duì)應(yīng)的實(shí)時(shí)明細(xì)表。在離線系統(tǒng)中兩個(gè)表關(guān)聯(lián)是非常簡(jiǎn)單的,因?yàn)殡x線計(jì)算在任務(wù)啟動(dòng)時(shí)已經(jīng)可以獲得兩張表的全量數(shù)據(jù),只要根據(jù)關(guān)聯(lián)鍵進(jìn)行分桶關(guān)聯(lián)就可以了。但流式計(jì)算不一樣,數(shù)據(jù)的到達(dá)是一個(gè)增量的過(guò)程,并且數(shù)據(jù)到達(dá)的時(shí)間是不確定的和無(wú)序的,因此在數(shù)據(jù)處理過(guò)程中會(huì)涉及中間狀態(tài)的保存和恢復(fù)機(jī)制等細(xì)節(jié)問(wèn)題。
比如A表和B表使用ID進(jìn)行實(shí)時(shí)關(guān)聯(lián),由于無(wú)法知道兩個(gè)表的到達(dá)順序,因此在兩個(gè)數(shù)據(jù)流的每條新數(shù)據(jù)到來(lái)時(shí),都需要到另外一張表中進(jìn)行查找。如A表的某條數(shù)據(jù)到達(dá),到B表的全量數(shù)據(jù)中查找,如果能查找到,說(shuō)明可以關(guān)聯(lián)上,拼接成一條記錄直接輸出到下游;但是如果關(guān)聯(lián)不上,則需要放在內(nèi)存或外部存儲(chǔ)中等待,直到B表的記錄也到達(dá)。多流關(guān)聯(lián)的一個(gè)關(guān)鍵點(diǎn)就是需要相互等待,只有雙方都到達(dá)了,才能關(guān)聯(lián)成功。
下面通過(guò)例子(訂單信息表和支付信息表關(guān)聯(lián))來(lái)說(shuō)明,如圖示。
在上面的例子中,實(shí)時(shí)采集兩張表的數(shù)據(jù),每到來(lái)一條新數(shù)據(jù)時(shí)都在內(nèi)存中的對(duì)方表截至當(dāng)前的全量數(shù)據(jù)中查找,如果能查找到,則說(shuō)明關(guān)聯(lián)成功,直接輸出;如果沒(méi)查找到,則把數(shù)據(jù)放在內(nèi)存中的自己表數(shù)據(jù)集合中等待。另外,不管是否關(guān)聯(lián)成功,內(nèi)存中的數(shù)據(jù)都需要備份到外部存儲(chǔ)系統(tǒng)中,在任務(wù)重啟時(shí),可以從外部存儲(chǔ)系統(tǒng)中恢復(fù)內(nèi)存數(shù)據(jù),這樣才能保證數(shù)據(jù)不丟失。因?yàn)樵谥貑r(shí),任務(wù)是續(xù)跑的,不會(huì)重新跑之前的數(shù)據(jù)。
另外,訂單記錄的變更有可能發(fā)生多次(比如訂單的多個(gè)字段多次更新),在這種情況下,需要根據(jù)訂單ID去重,避免A表和B表多次關(guān)聯(lián)成功;否則輸出到下游就會(huì)有多條記錄,這樣得到的數(shù)據(jù)是有重復(fù)的。
以上是整體的雙流關(guān)聯(lián)流程,在實(shí)際處理時(shí),考慮到查找數(shù)據(jù)的性能,實(shí)時(shí)關(guān)聯(lián)這個(gè)步驟一般會(huì)把數(shù)據(jù)按照關(guān)聯(lián)主鍵進(jìn)行分桶處理,并且在故障恢復(fù)時(shí)也根據(jù)分桶來(lái)進(jìn)行,以降低查找數(shù)據(jù)量和提高吞吐量。
3.維表使用
在離線系統(tǒng)中,一般是根據(jù)業(yè)務(wù)分區(qū)來(lái)關(guān)聯(lián)事實(shí)表和維表的,因?yàn)樵陉P(guān)聯(lián)之前維表的數(shù)據(jù)就已經(jīng)就緒了。而在實(shí)時(shí)計(jì)算中,關(guān)聯(lián)維表一般會(huì)使用當(dāng)前的實(shí)時(shí)數(shù)據(jù)(T)去關(guān)聯(lián)T-2的維表數(shù)據(jù),相當(dāng)于在T的數(shù)據(jù)到達(dá)之前需要把維表數(shù)據(jù)準(zhǔn)備好,并且一般是一份靜態(tài)的數(shù)據(jù)。
為什么在實(shí)時(shí)計(jì)算中這么做呢?主要基于以下幾點(diǎn)的考慮。
數(shù)據(jù)無(wú)法及時(shí)準(zhǔn)備好:當(dāng)?shù)竭_(dá)零點(diǎn)時(shí),實(shí)時(shí)流數(shù)據(jù)必須去關(guān)聯(lián)維表(因?yàn)椴荒艿却?#xff0c;如果等就失去了實(shí)時(shí)的特性),而這個(gè)時(shí)候T-1的維表數(shù)據(jù)一般不能在零點(diǎn)馬上準(zhǔn)備就緒(因?yàn)門-1的數(shù)據(jù)需要在T這一天加工生成),因此去關(guān)聯(lián)T-2維表,相當(dāng)于在T-1的一天時(shí)間里加工好T-2的維表數(shù)據(jù)。
無(wú)法準(zhǔn)確獲取全量的最新數(shù)據(jù):維表一般是全量的數(shù)據(jù),如果需要實(shí)時(shí)獲取到當(dāng)天的最新維表數(shù)據(jù),則需要T-1的數(shù)據(jù)+當(dāng)天變更才能獲取到完整的維表數(shù)據(jù)。也就是說(shuō),維表也作為一個(gè)實(shí)時(shí)流輸入,這就需要使用多流實(shí)時(shí)關(guān)聯(lián)來(lái)實(shí)現(xiàn)。但是由于實(shí)時(shí)數(shù)據(jù)是無(wú)序的并且到達(dá)時(shí)間不確定,因此在維表關(guān)聯(lián)上有歧義。
數(shù)據(jù)的無(wú)序性:如果維表作為實(shí)時(shí)流輸入的話,獲取維表數(shù)據(jù)將存在困難。比如10:00點(diǎn)的業(yè)務(wù)數(shù)據(jù)成功關(guān)聯(lián)維表,得到了相關(guān)的維表字段信息,這個(gè)時(shí)候是否就已經(jīng)拿到最新的維表數(shù)據(jù)了呢?其實(shí)這只代表拿到截至10:00點(diǎn)的最新?tīng)顟B(tài)數(shù)據(jù)(實(shí)時(shí)應(yīng)用永遠(yuǎn)也不知道什么時(shí)候才是最新?tīng)顟B(tài),因?yàn)椴恢谰S表后面是否會(huì)發(fā)生變更)。
因此在實(shí)時(shí)計(jì)算中維表關(guān)聯(lián)一般都統(tǒng)一使用T-2的數(shù)據(jù),這樣對(duì)于業(yè)務(wù)來(lái)說(shuō),起碼關(guān)聯(lián)到的維表數(shù)據(jù)是確定的(雖然維表數(shù)據(jù)有一定的延時(shí),但是許多業(yè)務(wù)的維表在兩天之間變化是很少的)。
在有些業(yè)務(wù)場(chǎng)景下,可以關(guān)聯(lián)T-1的數(shù)據(jù),但T-1的數(shù)據(jù)是不全的。比如在T-1的晚上22:00點(diǎn)開(kāi)始對(duì)維表進(jìn)行加工處理,在零點(diǎn)到達(dá)之前,有兩個(gè)小時(shí)可以把數(shù)據(jù)準(zhǔn)備好,這樣就可以在T的時(shí)候關(guān)聯(lián)T-1的數(shù)據(jù)了,但是會(huì)缺失兩個(gè)小時(shí)的維表變更過(guò)程。
另外,由于實(shí)時(shí)任務(wù)是常駐進(jìn)程的,因此維表的使用分為兩種形式。
全量加載:在維表數(shù)據(jù)較少的情況下,可以一次性加載到內(nèi)存中,在內(nèi)存中直接和實(shí)時(shí)流數(shù)據(jù)進(jìn)行關(guān)聯(lián),效率非常高。但缺點(diǎn)是內(nèi)存一直占用著,并且需要定時(shí)更新。例如:類目維表,每天只有幾萬(wàn)條記錄,在每天零點(diǎn)時(shí)全量加載到內(nèi)存中。
增量加載:維表數(shù)據(jù)很多,沒(méi)辦法全部加載到內(nèi)存中,可以使用增量查找和LRU過(guò)期的形式,讓最熱門的數(shù)據(jù)留在內(nèi)存中。其優(yōu)點(diǎn)是可以控制內(nèi)存的使用量;缺點(diǎn)是需要查找外部存儲(chǔ)系統(tǒng),運(yùn)行效率會(huì)降低。例如:會(huì)員維表,有上億條記錄,每次實(shí)時(shí)數(shù)據(jù)到達(dá)時(shí),去外部數(shù)據(jù)庫(kù)中查詢,并且把查詢結(jié)果放在內(nèi)存中,然后每隔一段時(shí)間清理一次最近最少使用的數(shù)據(jù),以避免內(nèi)存溢出。
在實(shí)際應(yīng)用中,這兩種形式根據(jù)維表數(shù)據(jù)量和實(shí)時(shí)性能要求綜合考慮來(lái)選擇使用。注:本書中出現(xiàn)的部分專有名詞、專業(yè)術(shù)語(yǔ)、產(chǎn)品名稱、軟件項(xiàng)目名稱、工具名稱等,是淘寶(中國(guó))軟件有限公司內(nèi)部項(xiàng)目的慣用詞語(yǔ),如與第三方名稱雷同,實(shí)屬巧合。
?
原文鏈接
本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的阿里巴巴大数据实践—实时技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 消息队列RocketMQ性能测试案例
- 下一篇: 对话猿辅导:阿里云远程办公零信任落地创新