分布式計(jì)算概述
版權(quán)說明:
本文由 LeftNotEasy 原創(chuàng),聯(lián)系方式wheeleast@gmail.com
本文可以被任意的轉(zhuǎn)載,請保留完整的文章(含版權(quán)說明)。如果商用,請聯(lián)系原作者。
發(fā)布于
前言:
云計(jì)算以及很多誤解
云計(jì)算這個概念被炒作得非常的火熱,只要跟互聯(lián)網(wǎng)沾邊的公司,都喜歡用上云計(jì)算這個詞。云計(jì)算其實(shí)不是一個那樣廣義的概念,云計(jì)算的定義并不是若干臺機(jī)器用某種方式管理起來,然后用于存儲或者計(jì)算這么簡單,包括很多的云殺毒、云安全、云存儲等等,都不一定是真正的云計(jì)算。
上wikipedia可以看看相對來說比較完備的云計(jì)算定義,云計(jì)算一個很重要的特性是跟虛擬化相關(guān)的,像水、電一樣為用戶提供計(jì)算的資源。另外在key features這個章節(jié)上說明了很多云計(jì)算的特性,如果某一個系統(tǒng)只具備了里面的一個或者很少的幾個特性,那稱其為云計(jì)算就有點(diǎn)那么勉強(qiáng)了。
云計(jì)算一些很重要的特性包括
1)可擴(kuò)展性,用戶能夠方便的增加、減少計(jì)算和存儲的能力,而且有著足夠的擴(kuò)展性。按這個定義、一堆GPU或者CPU組成的網(wǎng)格可能就很難稱為云計(jì)算了,這種超級計(jì)算機(jī)有著非常好的計(jì)算能力,但是對存儲的支持相對較差,據(jù)內(nèi)部人士透露,天河的存儲能力就相當(dāng)?shù)牟睿鲎鲇?jì)算還不錯,但是數(shù)據(jù)大了就只有傻眼了)
2)成本相對低廉,云計(jì)算對終端用戶而言,消費(fèi)相對較低,對于公司而言,也能減少管理成本。按這個定義,某些很“高級”的服務(wù)器組成的集群就很難稱為云計(jì)算了,之前聽說廣東公安局的身份證處理電腦的硬盤是單機(jī)320T的磁盤陣列,硬盤這種東西就是,買起來很便宜,但是硬盤架非常的貴,想在單機(jī)組成一個大的磁盤陣列,那可能就非常的高了。而且云計(jì)算的集群管理成本也不高。以一個極端的例子來說,一般一個大一點(diǎn)(100-200臺電腦)的網(wǎng)吧都要配2-3個網(wǎng)管。但是我所在的公司幾萬臺服務(wù)器,管理服務(wù)器的人就在20個人左右,相對管理成本很低。
3)穩(wěn)定性,至少在程序運(yùn)行的時候,錯誤處理能夠做好,比如說N個節(jié)點(diǎn)計(jì)算,某個節(jié)點(diǎn)死機(jī)了,那程序是不是一定得重新運(yùn)行?或者集群中某臺電腦的硬盤壞掉了,那這些數(shù)據(jù)會不會就丟失了?按這個定義,普通的多點(diǎn)存儲(簡單的將數(shù)據(jù)備份到2塊或者多塊硬盤中去),以及那些某個節(jié)點(diǎn)出錯了,計(jì)算任務(wù)就需要完全重跑的計(jì)算方式可能就不算云計(jì)算了(比如說MPI,這兒本章后面將會更詳細(xì)一點(diǎn)提到)
由此看出,云計(jì)算是一個很龐大的系統(tǒng),并非一般的開源項(xiàng)目(大的開源項(xiàng)目還是可以的,比如說Hadoop)可以完成的。就算能完成,也會有這樣那樣的問題,比如Hadoop集群就沒有實(shí)現(xiàn)Service的常駐運(yùn)行(只能跑job,也就是跑完就結(jié)束的那種)
分布式的數(shù)據(jù)挖掘
另一方面,數(shù)據(jù)挖掘也是一個很有意思、被很多人看重,也在很多領(lǐng)域上發(fā)揮大作用的一門學(xué)科,從個人而言,我對數(shù)據(jù)挖掘的興趣非常的大。傳統(tǒng)的計(jì)算機(jī)想要用數(shù)據(jù)挖掘,玩玩簡單的算法可以,但是在工業(yè)界看來,總體來說是一個玩具。比如說weka,學(xué)習(xí)算法用它還行,但是想要對大規(guī)模的數(shù)據(jù)進(jìn)行處理,是不太可能的。為了進(jìn)行大規(guī)模的數(shù)據(jù)處理,分布式計(jì)算就很必要了。
分布式計(jì)算分類:
一般來說,現(xiàn)在比較常見的并行計(jì)算有下面的方式:OpenMP, CUDA,MPI,MapReduce。
OpenMP:
是對于多核的條件下,也就是一些超級計(jì)算機(jī)可以使用的方式,一個很重要的特性是共享存儲,多個instance的關(guān)系是線程與線程的關(guān)系,也就限制了OpenMP主要是在單機(jī)(可能是超級計(jì)算機(jī))中進(jìn)行科學(xué)計(jì)算的任務(wù)。
CUDA:
這個概念是最近幾年的事情,似乎ATI最近也搞了一個通用計(jì)算的內(nèi)容,主要是用GPU并聯(lián)起來進(jìn)行計(jì)算,由于GPU的架構(gòu)和CPU不太一樣,采用這種方式可以對某些計(jì)算為主的任務(wù)加速幾個數(shù)量級。對這一塊我不太了解,也不太清楚現(xiàn)在CUDA計(jì)算、存儲能力,還有穩(wěn)定性等等做到什么樣的程度了。這里就不加以評論
Map-Reduce:
發(fā)揚(yáng)光大從Google的論文-MapReduce: Simplified data processing on large clusters開始的。Map-Reduce將程序的運(yùn)行分成了Map和Reduce兩個步驟,Map是一個讀取、處理原始數(shù)據(jù)的過程,而Reduce是根據(jù)Map處理的內(nèi)容,進(jìn)行整合、再處理。Reduce可以認(rèn)為又是一個Map,為下一級的Reduce過程作準(zhǔn)備,這樣數(shù)據(jù)的處理可以按這種方式進(jìn)行迭代。
Map-Reduce的重點(diǎn)在下面的幾處:
1)運(yùn)行程序的方式,Map-Reduce一般是在以GFS(Google文件系統(tǒng)),或者HDFS等類似的系統(tǒng)上面進(jìn)行的,這個系統(tǒng)一般有諸多的如磁盤負(fù)載平衡,數(shù)據(jù)冗余(replica),數(shù)據(jù)遷移(比如說集群中的某臺硬盤壞了,這個硬盤里面的數(shù)據(jù)會用某種方式備份到其他的硬盤中去,而且保證每塊硬盤的數(shù)據(jù)量都大致平衡)。不過這里先不談數(shù)據(jù)的存儲,主要談?wù)勅蝿?wù)的調(diào)度。
一般像這樣的集群里面都有一百臺以上的電腦,按每個電腦8個核計(jì)算,至少會有幾百上千個CPU的資源。在運(yùn)行每一個Map-Reduce的時候,用戶會先填寫需要多少的資源(CPU與內(nèi)存),然后集群的負(fù)責(zé)人(可能被稱為JobMaster),會去查看當(dāng)前集群中的計(jì)算資源情況,看看能否成功的運(yùn)行這個作業(yè)。如果不行的話,會排隊(duì)。舉一個Map-Reduce的例子:
對于一個很大的文件(由一堆的浮點(diǎn)數(shù)組成的),計(jì)算這個文件中Top1000的數(shù)是什么。那么程序的運(yùn)行可能是下面的過程。
a. 先在N個CPU(可能在不同的電腦中的)上運(yùn)行程序,每個CPU會負(fù)責(zé)數(shù)據(jù)的一部分,計(jì)算出Top1000的數(shù)值,將結(jié)果寫入一個文件(共N份數(shù)據(jù))
b. 在M = N/16個CPU上運(yùn)行程序,每個CPU會負(fù)責(zé)上面步驟的16個結(jié)果文件,計(jì)算出這些文件中Top1000的數(shù)值,然后將結(jié)果寫入一個文件(共N / 16份數(shù)據(jù))
c. 在O = M/16個CPU上運(yùn)行程序,同樣每個CPU負(fù)責(zé)上面的16個結(jié)果文件。(共N / 256份數(shù)據(jù))
..
按照這種方式迭代,直到求出真正的Top1000數(shù)值。
所以說,Map-Reduce的數(shù)據(jù)按每次迭代,是一個減少的過程,如果數(shù)據(jù)處理的時候有這樣的特性,那就非常適合于用Map-Reduce去解決。
2)多個進(jìn)程間的數(shù)據(jù)傳遞,對Map-Reduce而言,沒有辦法進(jìn)行傳統(tǒng)方式的進(jìn)程間通信(比如說socket通信),進(jìn)程間的通信純粹是用文件去聯(lián)系的,對于一個Map-Reduce任務(wù),是多級組成的,每一級會起若干的進(jìn)程,每個進(jìn)程做的事情就是去讀取上一級進(jìn)程生成的數(shù)據(jù),然后處理后寫入磁盤讓下一級進(jìn)程進(jìn)行讀取。
這個特性使得Map-Reduce有著良好的容錯性,當(dāng)某一級的某一個進(jìn)程出錯了(比如說機(jī)器死機(jī)了,程序出異常了等等),JobMaster會重新調(diào)度這個進(jìn)程到另外一個機(jī)器上,重新運(yùn)行,如果是由于外部的問題(比如說機(jī)器死機(jī)了),一般這樣的錯誤不會使得整個任務(wù)重復(fù)運(yùn)行。不過真正如果是寫程序出的邏輯問題,那程序也不能正常運(yùn)行的,JobMaster會試著將失敗的進(jìn)程調(diào)度幾次,如果都失敗了,則任務(wù)就失敗了。
但是用文件來同步機(jī)器間的通訊這個特性也有一個壞處,就是每當(dāng)Map-Reduce的某一個步驟運(yùn)行完后,需要重新調(diào)度下一級任務(wù)。如果是程序是一個重復(fù)迭代,直至收斂的過程,比如說KMeans算法、矩陣奇異值分解(SVD),則由于調(diào)度產(chǎn)生的開銷會非常的大,網(wǎng)絡(luò)傳輸不僅僅是發(fā)送需要的數(shù)據(jù),還有一個讀取文件、寫入文件的磁盤IO過程,在迭代次數(shù)很多的時候(在大規(guī)模的SVD分解的時候,迭代的次數(shù)可能會達(dá)到上萬次),這樣的方式可能是無法忍受的。
目前Map-Reduce已經(jīng)被很多的公司實(shí)現(xiàn),Map-Reduce并不是一套標(biāo)準(zhǔn),而是一種編程的方式,所以每個公司提供的API都有很大的區(qū)別,這會使得不能讓程序比較通用。一般來說,如果想學(xué)Map-Reduce,可以在單機(jī)配置一個Hadoop。這算是一個非常標(biāo)準(zhǔn)的Map-Reduce過程。
MPI:
全稱是Message Passing Interface,也就是定義了一系列的消息傳遞接口,可以看看MPI的Wikipedia,里面的內(nèi)容從了解MPI來說比較好,這里說說重點(diǎn),就不粘程序了。
MPI其實(shí)是一套標(biāo)準(zhǔn),對C,C++,F(xiàn)ortran,Java,,Python等都規(guī)定了一系列的接口,MPI的內(nèi)部有一系列的函數(shù),比如獲取當(dāng)前有多少進(jìn)程MPI_Comm_size, 進(jìn)程間同步MPI_Barrier等函數(shù)。對每種支持的語言,MPI都定了一個函數(shù)接口,也保證了不同的實(shí)現(xiàn)下,MPI的程序?qū)懗鰜矶际且粯拥摹PI是一個在學(xué)術(shù)界和工業(yè)界都應(yīng)用非常廣泛的一套接口,目前MPI的實(shí)現(xiàn)非常多,開源的有OpenMPI和MPICH比較好,有些MPI實(shí)現(xiàn)來自一些大學(xué)的實(shí)驗(yàn)室,有些MPI的實(shí)現(xiàn)來自一流的公司(比如Microsoft就有自己的一套實(shí)現(xiàn),還弄了一個C#版本的)。
MPI相對MapReduce來說,開發(fā)、調(diào)試也更接近單機(jī),MPI的部署可以在單機(jī)上完成,調(diào)用的時候也可以制定多線程運(yùn)行程序,如果有興趣,可以下載一個OpenMPI或者M(jìn)PICH,在自己的linux機(jī)器上進(jìn)行部署,寫寫簡單的代碼是足夠了。在單機(jī)保證邏輯正確的情況下,再上集群上面跑,就容易多了。
MPI的優(yōu)點(diǎn)是,程序的調(diào)度是一次性的,就是比如開始申請了50個進(jìn)程,那這50個進(jìn)程就會一起跑,同生同死,在程序中指定的同步等操作,也會讓這些進(jìn)程進(jìn)行同步,也可以在互相之間發(fā)送數(shù)據(jù),通過MPI的封裝,讓發(fā)數(shù)據(jù)更操作變得非常的方便(MPI有100多個函數(shù))。也就是從程序開始到結(jié)束,每個進(jìn)程只會調(diào)度一次,如果有迭代的操作,就用下面的語句,加上必要的同步就行了:while (condition) { … }。對于需要迭代次數(shù)比較多的程序,MPI的運(yùn)行時間普遍來說會比MapReduce強(qiáng)很多。
MPI相對MapReduce也有很多的缺點(diǎn),開源的MPI或者一些商業(yè)的MPI都沒有提供一個GFS系統(tǒng),這個讓大文件的存放,讀取都成了一個問題,如果底層有一個GFS,再在上面搭一個MPI的系統(tǒng),使用起來會非常的舒服。而且MPI的容錯性一般不容易做,因?yàn)槌绦蚴峭赖,某一個進(jìn)程掛了,整個任務(wù)就掛了,除非在程序運(yùn)行的時候,經(jīng)常往磁盤中dump數(shù)據(jù),不然容錯性是完全沒法保證的。
MPI據(jù)說還有一個缺點(diǎn),不過現(xiàn)在也拿不到資料去證實(shí),就是MPI的集群規(guī)模一般沒法做大,如果做到幾千臺,進(jìn)行數(shù)據(jù)傳輸、同步的開銷就大了,而MapReduce的集群規(guī)模做到幾萬臺電腦理論也是沒有什么問題的。
分布式計(jì)算的學(xué)習(xí):
分布式計(jì)算的學(xué)習(xí)主要可以參考一下下面的一些資料,首先是Google的幾篇重量級的文章:MapReduce: Simplified data processing on large clusters,也是上文提到過的,還有一篇Google File System。然后就是wikipedia,用map-reduce,clound-computing等關(guān)鍵字搜索一下,可以看到很多有意思的內(nèi)容。至于國內(nèi)的教材,我也沒有看太多,不太好評價,從我看到的一些來說,感覺講得還是不太清楚的。
另外如上面提到的,分布式計(jì)算的兩個最主要的分支:MapReduce和MPI,MapReduce復(fù)雜的地方來自底層的文件系統(tǒng),想搞清楚這個文件系統(tǒng)很痛苦的,而MPI復(fù)雜的地方來自眾多的函數(shù),到目前為止,我熟練使用的函數(shù)就十來個,不過也可以實(shí)現(xiàn)很多基本的功能了。
另外學(xué)習(xí)MapReduce看Hadoop,學(xué)習(xí)MPI看OpenMPI和MPICH都可以,其他開源的SDK都很難和上面這幾個相比。
從國內(nèi)的公司而言,MPI和MapReduce的應(yīng)用也很廣,比如百度就是同時使用的Hadoop與MPI,學(xué)好了這兩個東西,找個好工作還是比較容易的:)
本文編號:31299
本文鏈接:http://sikaile.net/wenshubaike/kjzx/31299.html