大規(guī)模的計(jì)數(shù)任務(wù)在實(shí)踐中出乎意料的困難,本文主要介紹傳統(tǒng)的批處理架構(gòu)實(shí)現(xiàn)計(jì)數(shù)任務(wù)和基于Lambda架構(gòu)實(shí)現(xiàn)計(jì)數(shù)吗跋。
傳統(tǒng)的批處理架構(gòu):
持續(xù)讀取數(shù)據(jù)的數(shù)據(jù)流每小時(shí)創(chuàng)建一次文件逢艘,這些文件通常被存儲(chǔ)在HDFS或MapR-FS等分布式文件系統(tǒng)中蒸绩。由調(diào)度程序安排批處理作業(yè)鳞青,用定期運(yùn)行的批處理作業(yè)來(lái)實(shí)現(xiàn)應(yīng)用程序的持續(xù)性涩哟。數(shù)據(jù)被持續(xù)地分割為文件;然后批處理作業(yè)將文件作為輸入盼玄,分析計(jì)算最近生成的一個(gè)文件,然后輸出計(jì)數(shù)結(jié)果潜腻,以此達(dá)到持續(xù)處理數(shù)據(jù)的效果埃儿。
這個(gè)架構(gòu)主要存在以下問(wèn)題:
太多獨(dú)立的部分:
為了計(jì)算數(shù)據(jù)中的事件數(shù),這種架構(gòu)動(dòng)用了太多的系統(tǒng)融涣。每一個(gè)系統(tǒng)都有學(xué)習(xí)成本和管理成本童番,還可能存在預(yù)知不到的bug精钮。
對(duì)時(shí)間的處理方法不明確:
假設(shè)需要設(shè)為每30分鐘計(jì)數(shù)一次。這個(gè)變動(dòng)涉及工作流調(diào)整邏輯剃斧,從而使DevOps問(wèn)題與業(yè)務(wù)需求混淆轨香。
預(yù)警:
假設(shè)除了每小時(shí)計(jì)數(shù)一次之外,還需要盡可能早地收到計(jì)數(shù)預(yù)警幼东。為了做到這一點(diǎn)臂容,可以在定期運(yùn)行的批處理作業(yè)之外,引入Strom來(lái)采集消息流根蟹,Strom實(shí)時(shí)提供近似的計(jì)數(shù)脓杉,批處理作業(yè)每小時(shí)提供準(zhǔn)確的計(jì)數(shù)。但是這樣一來(lái)就向架構(gòu)增加了他一個(gè)系統(tǒng)简逮,以及與之相關(guān)的新編程模型球散。
亂序事件流:
在實(shí)踐事件中,大多數(shù)事件流都是亂序的散庶,即事件的實(shí)際發(fā)生順序和數(shù)據(jù)中心所記錄的順序不一樣蕉堰,這就意味著本屬于前一批的事件可能被錯(cuò)誤地歸入當(dāng)前一批,并且批處理架構(gòu)很難解決這個(gè)問(wèn)題悲龟。
批處理作業(yè)的界限不清晰:
‘每小時(shí)’的定義含糊不清分個(gè)時(shí)間點(diǎn)實(shí)際上取決于不同系統(tǒng)之間的交互屋讶。充其量也只能做到大約每小時(shí)分割一次,而在分割時(shí)間點(diǎn)前后的事件既可能被歸入前一批躲舌,也可能被歸入當(dāng)前一批丑婿。將數(shù)據(jù)以小時(shí)為單位進(jìn)行分割,實(shí)際上是最簡(jiǎn)單的方法没卸。
Lambda架構(gòu):
Lambda架構(gòu)用定期運(yùn)行的批處理作業(yè)來(lái)實(shí)現(xiàn)應(yīng)用程序的持續(xù)性羹奉,并通過(guò)流處理器獲得預(yù)警。流處理器實(shí)時(shí)提供近似結(jié)果约计;批處理層最終會(huì)對(duì)近似結(jié)果予以糾正诀拭。
Lambda架構(gòu)存在的問(wèn)題:
開發(fā)周期長(zhǎng):
需要維護(hù)兩套分別跑在批處理和實(shí)時(shí)計(jì)算系統(tǒng)上面的代碼,當(dāng)數(shù)據(jù)源發(fā)生變更時(shí)煤蚌,需要同時(shí)對(duì)倆套代碼進(jìn)行更改
數(shù)據(jù)口徑不一致:
由于批量和實(shí)時(shí)計(jì)算走的是兩個(gè)計(jì)算框架和計(jì)算程序耕挨,算出的結(jié)果往往不同,需要經(jīng)常進(jìn)行數(shù)據(jù)核查和數(shù)據(jù)對(duì)比尉桩。
下一篇介紹一種全新的計(jì)數(shù)架構(gòu):Kappa架構(gòu)