我的上一篇BLOG《大數(shù)據(jù)處理的兩種模式》,談了大數(shù)據(jù)基于內(nèi)存的流式處理和基于硬盤的存儲(chǔ)處理。比較這兩種處理模式,因?yàn)閮?nèi)存的處理性能是硬盤的N個(gè)量級(jí),所以流式處理效率要遠(yuǎn)遠(yuǎn)高于存儲(chǔ)處理,但是流式處理本身有一個(gè)缺點(diǎn),或者說(shuō)是隱憂,上次沒(méi)有提到,今天來(lái)說(shuō)一下。
這要從數(shù)據(jù)處理的基本面:內(nèi)存、存儲(chǔ)、數(shù)據(jù)談起。
大家都知道,一個(gè)大數(shù)據(jù)集群是由很多臺(tái)計(jì)算機(jī)連上網(wǎng)絡(luò)組成的。計(jì)算機(jī)里面都有CPU、內(nèi)存、硬盤,計(jì)算機(jī)通過(guò)網(wǎng)絡(luò)交換數(shù)據(jù)執(zhí)行分布計(jì)算工作。集群會(huì)按照規(guī)則,同時(shí)運(yùn)行著一批執(zhí)行不同工作的分布計(jì)算任務(wù),每次分布計(jì)算任務(wù)處理的數(shù)據(jù)容量也不盡相同,少的幾十幾百M(fèi),多的幾十幾百G,更大的有時(shí)候會(huì)達(dá)到TB的規(guī)模(我們?cè)诟鞯夭渴鸬腖axcus集群時(shí)常處理TB級(jí)的數(shù)據(jù))。如果當(dāng)集群中某個(gè)時(shí)刻迸發(fā)出一個(gè)超大數(shù)據(jù)容量的計(jì)算任務(wù),這些數(shù)據(jù)要分散到不同的計(jì)算機(jī)上去執(zhí)行計(jì)算工作,這個(gè)總的數(shù)據(jù)容量超過(guò)集群的內(nèi)存容量的時(shí)候,怎么辦?
在存儲(chǔ)模式下,這個(gè)問(wèn)題很容易解決:拿硬盤來(lái)做緩存過(guò)渡。數(shù)據(jù)進(jìn)來(lái),檢查一下它的尺寸,如果太大,或者一時(shí)半會(huì)兒處理過(guò)不來(lái),就先放到硬盤保存起來(lái)。畢竟現(xiàn)在硬盤都已經(jīng)做到TB級(jí),不差錢的話,一臺(tái)計(jì)算機(jī)還可以多配幾個(gè)。能夠利用的存儲(chǔ)空間比內(nèi)存大得多。
放到了流式處理模式下,這個(gè)問(wèn)題就糾結(jié)了。如果數(shù)據(jù)進(jìn)入后硬盤再處理,就和存儲(chǔ)模式?jīng)]啥區(qū)別了。如果不是這樣,數(shù)據(jù)就會(huì)太多而內(nèi)存不足,內(nèi)存就要溢出,數(shù)據(jù)就要丟失。集群里任何一臺(tái)計(jì)算機(jī)出現(xiàn)這樣的故障,整個(gè)分布計(jì)算任務(wù)就是失敗。
緩解這個(gè)問(wèn)題的一個(gè)辦法是升級(jí)計(jì)算機(jī),CPU換成64位的,然后裝更多的內(nèi)存。原因是32位計(jì)算機(jī)內(nèi)存上限是4G,一個(gè)集群里,如果都是32位計(jì)算機(jī),同時(shí)出現(xiàn)幾個(gè)TB計(jì)算任務(wù),那得要多少臺(tái)計(jì)算機(jī)?64位計(jì)算機(jī)可以裝更多內(nèi)存,這樣計(jì)算機(jī)數(shù)量可以少些。還順帶提醒一下,雖然內(nèi)存的價(jià)格現(xiàn)在比以前是大大便宜了,但是和硬盤相比,單位容量還是貴得多!這樣的成本問(wèn)題一般運(yùn)營(yíng)商會(huì)比較在意。另外,這只是暫時(shí)的解決辦法,誰(shuí)也不知道下一次的超大數(shù)據(jù)計(jì)算任務(wù)啥時(shí)候發(fā)生,和同時(shí)會(huì)有幾個(gè)這樣的超大計(jì)算任務(wù)發(fā)生。
比較靠譜的解決辦法是在任務(wù)計(jì)算前,在數(shù)據(jù)量和集群內(nèi)存之間做一個(gè)評(píng)估。當(dāng)計(jì)算任務(wù)進(jìn)來(lái)的時(shí)候,判斷一下它攜帶數(shù)據(jù)的最大尺寸,如果集群的內(nèi)存足夠,就把這些內(nèi)存"預(yù)分配"給這個(gè)計(jì)算任務(wù)(這個(gè)工作要細(xì)劃到每一臺(tái)計(jì)算機(jī))。如果不夠,就讓它等著,直到其它計(jì)算任務(wù)完成工作,內(nèi)存被回收,新的內(nèi)存足夠時(shí),才放它執(zhí)行工作。第二種辦法和存儲(chǔ)模式差不多,數(shù)據(jù)先放在硬盤里存著,然后也是等到內(nèi)存足夠了,再執(zhí)行它的工作。當(dāng)然,這兩種辦法都會(huì)降低流式處理的計(jì)算效率,但也是沒(méi)有辦法的辦法,總比出現(xiàn)內(nèi)存溢出、計(jì)算任務(wù)失敗這樣的故障好吧。
綜上所述,流式處理是一種成本和效費(fèi)比都高的計(jì)算模式。如果你是土豪,像BAT一樣,有足夠的銀子,只關(guān)注數(shù)據(jù)處理的高性能,不在乎往基礎(chǔ)設(shè)施上多撒幾個(gè)錢,盡可以配上強(qiáng)勁的CPU、超大的內(nèi)存和硬盤或者固態(tài)盤,萬(wàn)兆的光纖網(wǎng)絡(luò),這時(shí)候加上流式處理是上選。如果你是一窮人,缺銀子,計(jì)算機(jī)的性能差,手上一把的32位老式計(jì)算機(jī)(我們有一個(gè)Laxcus集群現(xiàn)在還在用PentiumIII圖拉丁芯片,就因?yàn)檫@家伙省電,老而彌堅(jiān)!),內(nèi)存有限,網(wǎng)絡(luò)也不咋的,掏不起太多的電費(fèi),不計(jì)較數(shù)據(jù)計(jì)算的快和慢,那么湊合湊合,還是考慮存儲(chǔ)模式吧。