MapReduce淺讀

MapReduce概要

背景

幾個小時要處理完TB的數(shù)據(jù),但是這些程序一般都不是分布式系統(tǒng)人員開發(fā)的,使用起來因為一些分布式的系統(tǒng)問題,會非常的痛苦

總體目標(biāo)

非專業(yè)的分布式系統(tǒng)開發(fā)人員可以輕松的開發(fā)高效的處理大數(shù)據(jù)的程序,開發(fā)人員只需要定義好map和reduce函數(shù),然后就可以在成千上萬的機器上運行了,完全可以不去關(guān)心分布式系統(tǒng)的細(xì)節(jié)。

優(yōu)勢

模型容易編程,將一些分布式系統(tǒng)中的頭痛問題隱藏起來:

  • 并發(fā):和順序執(zhí)行一樣的結(jié)果
  • 如何在服務(wù)器上啟動worker和sever
  • 在不同機器之間移動數(shù)據(jù)
  • 容錯

模型的擴展性好,map和reduce函數(shù)彼此之間不需要等待,數(shù)據(jù)獲取上彼此也不干擾,因此可以并行執(zhí)行,因此可以通過簡單的加機器就提升系統(tǒng)性能

限制

那什么會是限制性能的因素呢?CPU?內(nèi)存?硬盤?網(wǎng)絡(luò)?一般來說會是網(wǎng)絡(luò)帶寬,要處理的數(shù)據(jù)傳輸會遠大于網(wǎng)絡(luò)帶寬,因此MR在設(shè)計會盡量減少網(wǎng)絡(luò)上的數(shù)據(jù)傳輸。

容錯

如果一個server在執(zhí)行MR job的時候掛了怎么辦?

我們可以簡單的重新執(zhí)行一遍任務(wù),這是基于一個基本的假設(shè):map和reduce函數(shù)都是純函數(shù),不會改變輸入的數(shù)據(jù)、不會保持狀態(tài)、不共享內(nèi)存、不存在map和map,或者reduce和reduce之間的聯(lián)系。

所以重新執(zhí)行也會產(chǎn)生相同的輸出。純函數(shù)的這個特點是MR相對于其他并行編程方案的主要不同,然后也是因為這個特性使得MR非常簡單。

更多的一些細(xì)節(jié)

  • master分配任務(wù)給worker,對于map函數(shù)會記錄住中間輸出位置
  • 每個輸入都存儲在GFS中,一共存3份
  • 所有的server同時運行GFS和MR workers,讓map worker從本機的GFS中讀取數(shù)據(jù),減少網(wǎng)絡(luò)傳輸
  • 輸入的分片會遠遠大于workers的數(shù)量,master在每臺機器上面執(zhí)行Map任務(wù),當(dāng)原來的任務(wù)完成之后map會處理新的任務(wù)
  • worker將輸出按key散列映射輸出到R分區(qū)保存在本地磁盤上
  • 當(dāng)全部沒有Map執(zhí)行的時候Reduce將會執(zhí)行
  • master告訴Reducers去獲取Map workers產(chǎn)生的中間數(shù)據(jù)分區(qū),Reduce worker將最終的結(jié)果輸出到GFS

負(fù)載均衡

怎么讓任務(wù)均衡的在worker上運行?因為每個分片處理的時間都是不同的,不同的內(nèi)容和大小,機器性能也不同,因此分片的個數(shù)要大于worker,不會因為某個分片處理的特別慢和影響整個的完成時間,早完成的worker會接著處理下一個分片,最后所有worker一起完成任務(wù)。

容錯

mr怎么處理worker崩潰?

  • map worker崩潰

    master重新執(zhí)行,將task重新分配給GFS上的其他副本的的機器上去,即使workers可能實際上已經(jīng)完成了任務(wù),但是reducer需要中間文件,因此需要重新執(zhí)行map任務(wù)。這個時候,可能有些reducer可能已經(jīng)讀取了crashed worker產(chǎn)生的中間文件,這個時候也沒有關(guān)系,因為map和reduce函數(shù)都是無副作用的,因此重新執(zhí)行就可

  • reduce worker在產(chǎn)生output之前崩潰:master將任務(wù)分配給其他worker執(zhí)行即可
  • reduce worker在產(chǎn)生output的時候崩潰:GFS的atomic rename能夠保證在完成之前臨時文件都是不可見的,因此master重新分配任務(wù)即可

其他的一些問題

  • 假如master意外的開啟兩個Map worker處理同一個輸入會怎么樣? 它只會告訴Reduce worker其中的一個。
  • 假如兩個Reduce worker處理中間數(shù)據(jù)的同一個分區(qū)會怎么樣? 它們都會將同一份數(shù)據(jù)寫到GFS上面,GFS的原子重命名操作會觸發(fā),先完成的獲勝將結(jié)果寫到GFS.
  • 假如一個worker非常慢怎么辦 — 一個掉隊者? 產(chǎn)生原因可能是非常糟糕的硬件設(shè)施。 master會對這些最后的任務(wù)創(chuàng)建第二份副本任務(wù)執(zhí)行。
  • 假如一個worker因為軟件或者硬件的問題導(dǎo)致計算結(jié)果錯誤怎么辦? 太糟糕了!MR假設(shè)是建立在"fail-stop"的cpu和軟件之上。
  • 假如master崩潰怎么辦?

不適合哪些應(yīng)用

首先必須明確并不是所以應(yīng)用都適合map/shuffle/reduce這種模式

  • 小數(shù)據(jù)不適合,因為成本太高
  • 對于大數(shù)據(jù)的更新,例如:在大索引中增加些新的文件
  • 不確定的讀(Map 和 Reduce都不能確定輸入)
  • 多次shuffles,例如:page-rank

總結(jié)

MapReduce的出現(xiàn)使得集群計算變的流行,但是MapReduce也有優(yōu)缺點:

缺點:不是最有效或者靈活的

有點:擴展性好,容易編程,錯誤處理和數(shù)據(jù)移動都被隱藏了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容