第46期:大數(shù)據(jù)集群該不該透明化?
這好像是個(gè)多余的問題,大部分大數(shù)據(jù)平臺(tái)都把集群透明化作為一個(gè)基本目標(biāo)在努力實(shí)現(xiàn)。
所謂集群透明化,是指把一個(gè)多臺(tái)機(jī)器的集群模擬得像一個(gè)巨大的單機(jī),只是系統(tǒng)管理層面知道體系是由很多單機(jī)集群而成,應(yīng)用程序則應(yīng)當(dāng)盡量少地感受到集群的存在,在概念上可以把整個(gè)集群理解成一臺(tái)機(jī)器,甚至在代碼級(jí)都可能和單機(jī)運(yùn)算兼容。
一
透明化主要有兩個(gè)方面。一方面是數(shù)據(jù)存儲(chǔ),提供統(tǒng)一的集群文件系統(tǒng)或者數(shù)據(jù)庫系統(tǒng),應(yīng)用程序不需要關(guān)心數(shù)據(jù)具體存放在哪里了,系統(tǒng)將自動(dòng)尋找合適的節(jié)點(diǎn),并提供一定的冗余容錯(cuò)機(jī)制;內(nèi)存的透明化相對(duì)要困難一些,有時(shí)需要應(yīng)用程序知道集群的存在。另一方面是任務(wù)分配,系統(tǒng)負(fù)責(zé)將大任務(wù)拆分成小任務(wù)并分配給各個(gè)節(jié)點(diǎn)機(jī)去執(zhí)行,在有節(jié)點(diǎn)故障時(shí)能再將任務(wù)分配給其它節(jié)點(diǎn);有時(shí)任務(wù)拆分比較困難,也需要程序員事先設(shè)計(jì)好拆分方案。
透明化顯然有好處,可以降低理解難度,開發(fā)程序時(shí)和單機(jī)情況差不多,也能提高代碼的兼容性。從這個(gè)意義上講,只要能透明化就都應(yīng)當(dāng)去做,除非是實(shí)現(xiàn)難度太大(比如上面提到內(nèi)存和任務(wù)拆分)的情況。
那么,為什么還要提出該不該透明化的問題呢?
二
因?yàn)椋该骰y以獲得***的性能,而高性能對(duì)于大數(shù)據(jù)計(jì)算又是一個(gè)關(guān)鍵的目標(biāo)。
高性能計(jì)算方案因運(yùn)算目標(biāo)和數(shù)據(jù)特征而異,并沒有普適的優(yōu)化方法。好算法需要特定的數(shù)據(jù)分布及任務(wù)分配方案,而使用系統(tǒng)自動(dòng)的機(jī)制就很可能無法實(shí)現(xiàn)了。有些優(yōu)化手段還是互相矛盾的,如果不做透明化則可以根據(jù)場(chǎng)景選用哪種。而實(shí)現(xiàn)透明化時(shí),為了保證在任何情況都能正常工作,經(jīng)常只能選擇較保險(xiǎn)的方案,常常這并不是性能***的方案。
比如在做JOIN運(yùn)算時(shí),我們可以從業(yè)務(wù)上區(qū)分維表和事實(shí)表,也事先知道維表的容量,如果維表數(shù)據(jù)量較小,則可以將維表主動(dòng)存儲(chǔ)到所有節(jié)點(diǎn)中甚至讀入內(nèi)存,而只把事實(shí)表分段存儲(chǔ)到節(jié)點(diǎn)中,并按此分布設(shè)計(jì)更優(yōu)的算法能。而透明化方案不能做這些假定,要處理一般情況,就不能區(qū)分維表和事實(shí)表,也不能假定維表足夠小。有些計(jì)算平臺(tái)能夠臨時(shí)測(cè)定數(shù)據(jù)特征以采用更優(yōu)的計(jì)算 方案,針對(duì)JOIN這種被研究得很透的運(yùn)算有可能做到,但更復(fù)雜的情況就不一定了。
另外,透明化體系一般都會(huì)有一個(gè)較復(fù)雜的框架來控制數(shù)據(jù)分布及實(shí)現(xiàn)任務(wù)調(diào)度,這個(gè)事并不簡(jiǎn)單,本身也會(huì)消耗很多資源,而如果不搞透明化或透明化程度較弱時(shí),則可以把這些資源本用到計(jì)算上。比如容錯(cuò)機(jī)制,節(jié)點(diǎn)機(jī)可能有故障,集群體系要能在故障機(jī)數(shù)量不多時(shí)保證計(jì)算仍然可以進(jìn)行下去,這需要重新設(shè)計(jì)數(shù)據(jù)的冗余方案,要求高時(shí)還要及時(shí)保存中間結(jié)果。
三
一定程度地犧牲透明化,可以換來更高的性能。數(shù)據(jù)存儲(chǔ)可以直接使用節(jié)點(diǎn)機(jī)的文件系統(tǒng),程序員可以根據(jù)運(yùn)算的特征以及節(jié)點(diǎn)的能力來決定數(shù)據(jù)的分布以及冗余方案,對(duì)應(yīng)用層并不提供一個(gè)統(tǒng)一的網(wǎng)絡(luò)文件系統(tǒng)。任務(wù)分配也由程序員自行處理,也是根據(jù)運(yùn)算特殊及數(shù)據(jù)分布以及節(jié)點(diǎn)能力來安排任務(wù),養(yǎng)活框架消耗,將盡量多的資源都用到計(jì)算任務(wù)本身上。
當(dāng)然,犧牲透明化會(huì)帶來程序的開發(fā)復(fù)雜度提高,與單機(jī)情況的兼容性變差,這也是需要權(quán)衡的問題。透明化與否,并不是非黑即白的選擇。完全透明化,可能得不到***的性能;徹底不透明,又會(huì)導(dǎo)致開發(fā)成本又過高。具體要透明到什么程度,根據(jù)實(shí)際場(chǎng)來選擇。
一般來講,規(guī)模較大的集群要做好透明化,小規(guī)模集群則可以實(shí)施個(gè)性化管理。
大集群的節(jié)點(diǎn)多,如果不采用透明化方案,每個(gè)節(jié)點(diǎn)都個(gè)性化管理,那復(fù)雜度會(huì)提升太多,雖然可能獲得一些性能提升,但帶來的麻煩度很可能更高。而小集群則實(shí)施每個(gè)節(jié)點(diǎn)的個(gè)性化管理是管得過來的,節(jié)點(diǎn)存儲(chǔ)的數(shù)據(jù)各有不同。對(duì)于容錯(cuò),大集群在很短的時(shí)間段內(nèi)就可能發(fā)生故障節(jié)點(diǎn),一定要有較強(qiáng)的自動(dòng)容錯(cuò)能力,這時(shí)花在框架上的開銷是必須的;而小集群則沒有這個(gè)問題,幾個(gè)節(jié)點(diǎn)的集群保證連續(xù)正常工作許多天并不是個(gè)小概率事件,就沒必要在框架上消耗太多資源。