MapReduce原理与设计思想(转载:http://blog.jobbole.com/80619/)
簡(jiǎn)單解釋 MapReduce 算法
一個(gè)有趣的例子
你想數(shù)出一摞牌中有多少?gòu)埡谔?。直觀方式是一張一張檢查并且數(shù)出有多少?gòu)埵呛谔?#xff1f;
MapReduce方法則是:
拆分
MapReduce合并了兩種經(jīng)典函數(shù):
- 映射(Mapping)對(duì)集合里的每個(gè)目標(biāo)應(yīng)用同一個(gè)操作。即,如果你想把表單里每個(gè)單元格乘以二,那么把這個(gè)函數(shù)單獨(dú)地應(yīng)用在每個(gè)單元格上的操作就屬于mapping。
- 化簡(jiǎn)(Reducing )遍歷集合中的元素來(lái)返回一個(gè)綜合的結(jié)果。即,輸出表單里一列數(shù)字的和這個(gè)任務(wù)屬于reducing。
重新審視上面的例子
重新審視我們?cè)瓉?lái)那個(gè)分散紙牌的例子,我們有MapReduce數(shù)據(jù)分析的基本方法。友情提示:這不是個(gè)嚴(yán)謹(jǐn)?shù)睦?。在這個(gè)例子里,人代表計(jì)算機(jī),因?yàn)樗麄兺瑫r(shí)工作,所以他們是個(gè)集群。在大多數(shù)實(shí)際應(yīng)用中,我們假設(shè)數(shù)據(jù)已經(jīng)在每臺(tái)計(jì)算機(jī)上了 – 也就是說(shuō)把牌分發(fā)出去并不是MapReduce的一步。(事實(shí)上,在計(jì)算機(jī)集群中如何存儲(chǔ)文件是Hadoop的真正核心。)
通過(guò)把牌分給多個(gè)玩家并且讓他們各自數(shù)數(shù),你就在并行執(zhí)行運(yùn)算,因?yàn)槊總€(gè)玩家都在同時(shí)計(jì)數(shù)。這同時(shí)把這項(xiàng)工作變成了分布式的,因?yàn)槎鄠€(gè)不同的人在解決同一個(gè)問(wèn)題的過(guò)程中并不需要知道他們的鄰居在干什么。
通過(guò)告訴每個(gè)人去數(shù)數(shù),你對(duì)一項(xiàng)檢查每張牌的任務(wù)進(jìn)行了映射。 你不會(huì)讓他們把黑桃牌遞給你,而是讓他們把你想要的東西化簡(jiǎn)為一個(gè)數(shù)字。
另外一個(gè)有意思的情況是牌分配得有多均勻。MapReduce假設(shè)數(shù)據(jù)是洗過(guò)的(shuffled)- 如果所有黑桃都分到了一個(gè)人手上,那他數(shù)牌的過(guò)程可能比其他人要慢很多。
如果有足夠的人的話,問(wèn)一些更有趣的問(wèn)題就相當(dāng)簡(jiǎn)單了?– 比如“一摞牌的平均值(二十一點(diǎn)算法)是什么”。你可以通過(guò)合并“所有牌的值的和是什么”及“我們有多少?gòu)埮啤边@兩個(gè)問(wèn)題來(lái)得到答案。用這個(gè)和除以牌的張數(shù)就得到了平均值。
MapReduce算法的機(jī)制要遠(yuǎn)比這復(fù)雜得多,但是主體思想是一致的 – 通過(guò)分散計(jì)算來(lái)分析大量數(shù)據(jù)。無(wú)論是Facebook、NASA,還是小創(chuàng)業(yè)公司,MapReduce都是目前分析互聯(lián)網(wǎng)級(jí)別數(shù)據(jù)的主流方法。
?
Hadoop中的MapReduce
大規(guī)模數(shù)據(jù)處理時(shí),MapReduce在三個(gè)層面上的基本構(gòu)思
如何對(duì)付大數(shù)據(jù)處理:分而治之
對(duì)相互間不具有計(jì)算依賴關(guān)系的大數(shù)據(jù),實(shí)現(xiàn)并行最自然的辦法就是采取分而治之的策略
上升到抽象模型:Mapper與Reducer
MPI等并行計(jì)算方法缺少高層并行編程模型,為了克服這一缺陷,MapReduce借鑒了Lisp函數(shù)式語(yǔ)言中的思想,用Map和Reduce兩個(gè)函數(shù)提供了高層的并行編程抽象模型
上升到構(gòu)架:統(tǒng)一構(gòu)架,為程序員隱藏系統(tǒng)層細(xì)節(jié)
MPI等并行計(jì)算方法缺少統(tǒng)一的計(jì)算框架支持,程序員需要考慮數(shù)據(jù)存儲(chǔ)、劃分、分發(fā)、結(jié)果收集、錯(cuò)誤恢復(fù)等諸多細(xì)節(jié);為此,MapReduce設(shè)計(jì)并提供了統(tǒng)一的計(jì)算框架,為程序員隱藏了絕大多數(shù)系統(tǒng)層面的處理細(xì)節(jié)
1.對(duì)付大數(shù)據(jù)處理-分而治之
什么樣的計(jì)算任務(wù)可進(jìn)行并行化計(jì)算?
并行計(jì)算的第一個(gè)重要問(wèn)題是如何劃分計(jì)算任務(wù)或者計(jì)算數(shù)據(jù)以便對(duì)劃分的子任務(wù)或數(shù)據(jù)塊同時(shí)進(jìn)行計(jì)算。但一些計(jì)算問(wèn)題恰恰無(wú)法進(jìn)行這樣的劃分!
Nine women cannot have a baby in one month!
例如:Fibonacci函數(shù):? Fk+2?= Fk?+ Fk+1
前后數(shù)據(jù)項(xiàng)之間存在很強(qiáng)的依賴關(guān)系!只能串行計(jì)算!
結(jié)論:不可分拆的計(jì)算任務(wù)或相互間有依賴關(guān)系的數(shù)據(jù)無(wú)法進(jìn)行并行計(jì)算!
大數(shù)據(jù)的并行化計(jì)算
一個(gè)大數(shù)據(jù)若可以分為具有同樣計(jì)算過(guò)程的數(shù)據(jù)塊,并且這些數(shù)據(jù)塊之間不存在數(shù)據(jù)依賴關(guān)系,則提高處理速度的最好辦法就是并行計(jì)算
例如:假設(shè)有一個(gè)巨大的2維數(shù)據(jù)需要處理(比如求每個(gè)元素的開(kāi)立方),其中對(duì)每個(gè)元素的處理是相同的,并且數(shù)據(jù)元素間不存在數(shù)據(jù)依賴關(guān)系,可以考慮不同的劃分方法將其劃分為子數(shù)組,由一組處理器并行處理
2.構(gòu)建抽象模型-Map和Reduce
借鑒函數(shù)式設(shè)計(jì)語(yǔ)言Lisp的設(shè)計(jì)思想
函數(shù)式程序設(shè)計(jì)(functional programming)語(yǔ)言Lisp是一種列表處理 語(yǔ)言(List processing),是一種應(yīng)用于人工智能處理的符號(hào)式語(yǔ)言,由MIT的人工智能專家、圖靈獎(jiǎng)獲得者John McCarthy于1958年設(shè)計(jì)發(fā)明。
Lisp定義了可對(duì)列表元素進(jìn)行整體處理的各種操作,如:
如:(add #(1 2 3 4) #(4 3 2 1))?? 將產(chǎn)生結(jié)果: #(5 5 5 5)
Lisp中也提供了類似于Map和Reduce的操作
如: (map ‘vector #+ #(1 2 3 4 5)? #(10 11 12 13 14))
通過(guò)定義加法map運(yùn)算將2個(gè)向量相加產(chǎn)生結(jié)果#(11 13 15 17 19)
(reduce #’+ #(11? 13? 15? 17? 19)) 通過(guò)加法歸并產(chǎn)生累加結(jié)果75
Map: 對(duì)一組數(shù)據(jù)元素進(jìn)行某種重復(fù)式的處理
Reduce: 對(duì)Map的中間結(jié)果進(jìn)行某種進(jìn)一步的結(jié)果整
關(guān)鍵思想:為大數(shù)據(jù)處理過(guò)程中的兩個(gè)主要處理操作提供一種抽象機(jī)制
MapReduce中的Map和Reduce操作的抽象描述
MapReduce借鑒了函數(shù)式程序設(shè)計(jì)語(yǔ)言Lisp中的思想,定義了如下的Map和Reduce兩個(gè)抽象的編程接口,由用戶去編程實(shí)現(xiàn):
map:?(k1; v1)?→?[(k2; v2)]輸入:鍵值對(duì)(k1; v1)表示的數(shù)據(jù)
處理:文檔數(shù)據(jù)記錄(如文本文件中的行,或數(shù)據(jù)表格中的行)將以“鍵值對(duì)”形式傳入map函數(shù);map函數(shù)將處理這些鍵值對(duì),并以另一種鍵值對(duì)形式輸出處理的一組鍵值對(duì)中間結(jié)果 [(k2; v2)]
輸出:鍵值對(duì)[(k2; v2)]表示的一組中間數(shù)據(jù)
reduce:?(k2; [v2])?→?[(k3; v3)]輸入: 由map輸出的一組鍵值對(duì)[(k2; v2)] 將被進(jìn)行合并處理將同樣主鍵下的不同數(shù)值合并到一個(gè)列表[v2]中,故reduce的輸入為(k2; [v2])
處理:對(duì)傳入的中間結(jié)果列表數(shù)據(jù)進(jìn)行某種整理或進(jìn)一步的處理,并產(chǎn)生最終的某種形式的結(jié)果輸出[(k3; v3)] 。
輸出:最終輸出結(jié)果[(k3; v3)]
Map和Reduce為程序員提供了一個(gè)清晰的操作接口抽象描述
各個(gè)map函數(shù)對(duì)所劃分的數(shù)據(jù)并行處理,從不同的輸入數(shù)據(jù)產(chǎn)生不同的中間結(jié)果輸出
各個(gè)reduce也各自并行計(jì)算,各自負(fù)責(zé)處理不同的中間結(jié)果數(shù)據(jù)集合進(jìn)行reduce處理之前,必須等到所有的map函數(shù)做完,因此,在進(jìn)入reduce前需要有一個(gè)同步障(barrier);這個(gè)階段也負(fù)責(zé)對(duì)map的中間結(jié)果數(shù)據(jù)進(jìn)行收集整理(aggregation & shuffle)處理,以便reduce更有效地計(jì)算最終結(jié)果最終匯總所有reduce的輸出結(jié)果即可獲得最終結(jié)果
基于MapReduce的處理過(guò)程示例—文檔詞頻統(tǒng)計(jì):WordCount
設(shè)有4組原始文本數(shù)據(jù):
Text 1:?the weather is good???????? Text 2:?today is good
Text 3:?good weather is good????? Text 4:?today has good weather
傳統(tǒng)的串行處理方式(Java):
Java| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | String[] text = new String[] { “hello world”, “hello every one”, “say hello to everyone in the world” }; HashTable ht = new HashTable();???? for(i = 0; i < 3; ++i) { ????StringTokenizer st = new StringTokenizer(text[i]); ????while (st.hasMoreTokens()) {?? ????????String word = st.nextToken(); ????????if(!ht.containsKey(word)) {?? ????????????ht.put(word, new Integer(1)); ????????} else { ????????????int wc = ((Integer)ht.get(word)).intValue() +1;// 計(jì)數(shù)加1 ????????????ht.put(word, new Integer(wc)); ????????} ????} } for (Iterator itr=ht.KeySet().iterator();??itr.hasNext(); ) { ????String word = (String)itr.next(); ????System.out.print(word+ “: ”+ (Integer)ht.get(word)+“;?? ”); |
輸出:good:? 5;?? has: 1;? is: 3;?? the: 1;?? today: 2;??? weather: 3
基于MapReduce的處理過(guò)程示例—文檔詞頻統(tǒng)計(jì):WordCount
MapReduce處理方式
使用4個(gè)map節(jié)點(diǎn):
map節(jié)點(diǎn)1:
輸入:(text1, “the weather is good”)
輸出:(the, 1), (weather, 1), (is, 1), (good, 1)
map節(jié)點(diǎn)2:
輸入:(text2, “today is good”)
輸出:(today, 1), (is, 1), (good, 1)
map節(jié)點(diǎn)3:
輸入:(text3, “good weather is good”)
輸出:(good, 1), (weather, 1), (is, 1), (good, 1)
map節(jié)點(diǎn)4:
輸入:(text3, “today has good weather”)
輸出:(today, 1), (has, 1), (good, 1), (weather, 1)
使用3個(gè)reduce節(jié)點(diǎn):
MapReduce處理方式
MapReduce偽代碼(實(shí)現(xiàn)Map和Reduce兩個(gè)函數(shù)):
C| 1 2 3 4 5 6 7 8 9 10 11 12 13 | Class Mapper method map(String input_key, String input_value): ??// input_key: text document name ??// input_value: document contents ??for each word w in input_value: ??????EmitIntermediate(w, "1"); Class Reducer method reduce(String output_key, Iterator intermediate_values): ??// output_key: a word ??// output_values: a list of counts ??int result = 0; ??for each v in intermediate_values: ??????result += ParseInt(v); ??Emit(output_key, result); |
?
3.上升到構(gòu)架-自動(dòng)并行化并隱藏低層細(xì)節(jié)
如何提供統(tǒng)一的計(jì)算框架
MapReduce提供一個(gè)統(tǒng)一的計(jì)算框架,可完成:
計(jì)算任務(wù)的劃分和調(diào)度
數(shù)據(jù)的分布存儲(chǔ)和劃分
處理數(shù)據(jù)與計(jì)算任務(wù)的同步
結(jié)果數(shù)據(jù)的收集整理(sorting, combining, partitioning,…)
系統(tǒng)通信、負(fù)載平衡、計(jì)算性能優(yōu)化處理
處理系統(tǒng)節(jié)點(diǎn)出錯(cuò)檢測(cè)和失效恢復(fù)
MapReduce最大的亮點(diǎn)
通過(guò)抽象模型和計(jì)算框架把需要做什么(what need to do)與具體怎么做(how to do)分開(kāi)了,為程序員提供一個(gè)抽象和高層的編程接口和框架
程序員僅需要關(guān)心其應(yīng)用層的具體計(jì)算問(wèn)題,僅需編寫(xiě)少量的處理應(yīng)用本身計(jì)算問(wèn)題的程序代碼
如何具體完成這個(gè)并行計(jì)算任務(wù)所相關(guān)的諸多系統(tǒng)層細(xì)節(jié)被隱藏起來(lái),交給計(jì)算框架去處理:從分布代碼的執(zhí)行,到大到數(shù)千小到單個(gè)節(jié)點(diǎn)集群的自動(dòng)調(diào)度使用
MapReduce提供的主要功能
任務(wù)調(diào)度:提交的一個(gè)計(jì)算作業(yè)(job)將被劃分為很多個(gè)計(jì)算任務(wù)(tasks), 任務(wù)調(diào)度功能主要負(fù)責(zé)為這些劃分后的計(jì)算任務(wù)分配和調(diào)度計(jì)算節(jié)點(diǎn)(map節(jié)點(diǎn)或reducer節(jié)點(diǎn)); 同時(shí)負(fù)責(zé)監(jiān)控這些節(jié)點(diǎn)的執(zhí)行狀態(tài), 并負(fù)責(zé)map節(jié)點(diǎn)執(zhí)行的同步控制(barrier); 也負(fù)責(zé)進(jìn)行一些計(jì)算性能優(yōu)化處理, 如對(duì)最慢的計(jì)算任務(wù)采用多備份執(zhí)行、選最快完成者作為結(jié)果
數(shù)據(jù)/代碼互定位:為了減少數(shù)據(jù)通信,一個(gè)基本原則是本地化數(shù)據(jù)處理(locality),即一個(gè)計(jì)算節(jié)點(diǎn)盡可能處理其本地磁盤(pán)上所分布存儲(chǔ)的數(shù)據(jù),這實(shí)現(xiàn)了代碼向數(shù)據(jù)的遷移;當(dāng)無(wú)法進(jìn)行這種本地化數(shù)據(jù)處理時(shí),再尋找其它可用節(jié)點(diǎn)并將數(shù)據(jù)從網(wǎng)絡(luò)上傳送給該節(jié)點(diǎn)(數(shù)據(jù)向代碼遷移),但將盡可能從數(shù)據(jù)所在的本地機(jī)架上尋找可用節(jié)點(diǎn)以減少通信延遲
出錯(cuò)處理:以低端商用服務(wù)器構(gòu)成的大規(guī)模MapReduce計(jì)算集群中,節(jié)點(diǎn)硬件(主機(jī)、磁盤(pán)、內(nèi)存等)出錯(cuò)和軟件有bug是常態(tài),因此,MapReducer需要能檢測(cè)并隔離出錯(cuò)節(jié)點(diǎn),并調(diào)度分配新的節(jié)點(diǎn)接管出錯(cuò)節(jié)點(diǎn)的計(jì)算任務(wù) 分布式數(shù)據(jù)存儲(chǔ)與文件管理:海量數(shù)據(jù)處理需要一個(gè)良好的分布數(shù)據(jù)存儲(chǔ)和文件管理系統(tǒng)支撐,該文件系統(tǒng)能夠把海量數(shù)據(jù)分布存儲(chǔ)在各個(gè)節(jié)點(diǎn)的本地磁盤(pán)上,但保持整個(gè)數(shù)據(jù)在邏輯上成為一個(gè)完整的數(shù)據(jù)文件;為了提供數(shù)據(jù)存儲(chǔ)容錯(cuò)機(jī)制,該文件系統(tǒng)還要提供數(shù)據(jù)塊的多備份存儲(chǔ)管理能力 Combiner和Partitioner:為了減少數(shù)據(jù)通信開(kāi)銷,中間結(jié)果數(shù)據(jù)進(jìn)入reduce節(jié)點(diǎn)前需要進(jìn)行合并(combine)處理,把具有同樣主鍵的數(shù)據(jù)合并到一起避免重復(fù)傳送; 一個(gè)reducer節(jié)點(diǎn)所處理的數(shù)據(jù)可能會(huì)來(lái)自多個(gè)map節(jié)點(diǎn), 因此, map節(jié)點(diǎn)輸出的中間結(jié)果需使用一定的策略進(jìn)行適當(dāng)?shù)膭澐?partitioner)處理,保證相關(guān)數(shù)據(jù)發(fā)送到同一個(gè)reducer節(jié)點(diǎn)基于Map和Reduce的并行計(jì)算模型
4.MapReduce的主要設(shè)計(jì)思想和特征
1、向“外”橫向擴(kuò)展,而非向“上”縱向擴(kuò)展(Scale “out”, not “up”)
即MapReduce集群的構(gòu)筑選用價(jià)格便宜、易于擴(kuò)展的大量低端商用服務(wù)器,而非價(jià)格昂貴、不易擴(kuò)展的高端服務(wù)器(SMP)低端服務(wù)器市場(chǎng)與高容量Desktop PC有重疊的市場(chǎng),因此,由于相互間價(jià)格的競(jìng)爭(zhēng)、可互換的部件、和規(guī)模經(jīng)濟(jì)效應(yīng),使得低端服務(wù)器保持較低的價(jià)格基于TPC-C在2007年底的性能評(píng)估結(jié)果,一個(gè)低端服務(wù)器平臺(tái)與高端的共享存儲(chǔ)器結(jié)構(gòu)的服務(wù)器平臺(tái)相比,其性價(jià)比大約要高4倍;如果把外存價(jià)格除外,低端服務(wù)器性價(jià)比大約提高12倍對(duì)于大規(guī)模數(shù)據(jù)處理,由于有大量數(shù)據(jù)存儲(chǔ)需要,顯而易見(jiàn),基于低端服務(wù)器的集群遠(yuǎn)比基于高端服務(wù)器的集群優(yōu)越,這就是為什么MapReduce并行計(jì)算集群會(huì)基于低端服務(wù)器實(shí)現(xiàn)
2、失效被認(rèn)為是常態(tài)(Assume failures are common)
MapReduce集群中使用大量的低端服務(wù)器(Google目前在全球共使用百萬(wàn)臺(tái)以上的服務(wù)器節(jié)點(diǎn)),因此,節(jié)點(diǎn)硬件失效和軟件出錯(cuò)是常態(tài),因而:一個(gè)良好設(shè)計(jì)、具有容錯(cuò)性的并行計(jì)算系統(tǒng)不能因?yàn)楣?jié)點(diǎn)失效而影響計(jì)算服務(wù)的質(zhì)量,任何節(jié)點(diǎn)失效都不應(yīng)當(dāng)導(dǎo)致結(jié)果的不一致或不確定性;任何一個(gè)節(jié)點(diǎn)失效時(shí),其它節(jié)點(diǎn)要能夠無(wú)縫接管失效節(jié)點(diǎn)的計(jì)算任務(wù);當(dāng)失效節(jié)點(diǎn)恢復(fù)后應(yīng)能自動(dòng)無(wú)縫加入集群,而不需要管理員人工進(jìn)行系統(tǒng)配置MapReduce并行計(jì)算軟件框架使用了多種有效的機(jī)制,如節(jié)點(diǎn)自動(dòng)重啟技術(shù),使集群和計(jì)算框架具有對(duì)付節(jié)點(diǎn)失效的健壯性,能有效處理失效節(jié)點(diǎn)的檢測(cè)和恢復(fù)。
3、把處理向數(shù)據(jù)遷移(Moving processing to the data)
傳統(tǒng)高性能計(jì)算系統(tǒng)通常有很多處理器節(jié)點(diǎn)與一些外存儲(chǔ)器節(jié)點(diǎn)相連,如用區(qū)域存儲(chǔ)網(wǎng)絡(luò)(SAN,Storage Area Network)連接的磁盤(pán)陣列,因此,大規(guī)模數(shù)據(jù)處理時(shí)外存文件數(shù)據(jù)I/O訪問(wèn)會(huì)成為一個(gè)制約系統(tǒng)性能的瓶頸。為了減少大規(guī)模數(shù)據(jù)并行計(jì)算系統(tǒng)中的數(shù)據(jù)通信開(kāi)銷,代之以把數(shù)據(jù)傳送到處理節(jié)點(diǎn)(數(shù)據(jù)向處理器或代碼遷移),應(yīng)當(dāng)考慮將處理向數(shù)據(jù)靠攏和遷移。MapReduce采用了數(shù)據(jù)/代碼互定位的技術(shù)方法,計(jì)算節(jié)點(diǎn)將首先將盡量負(fù)責(zé)計(jì)算其本地存儲(chǔ)的數(shù)據(jù),以發(fā)揮數(shù)據(jù)本地化特點(diǎn)(locality),僅當(dāng)節(jié)點(diǎn)無(wú)法處理本地?cái)?shù)據(jù)時(shí),再采用就近原則尋找其它可用計(jì)算節(jié)點(diǎn),并把數(shù)據(jù)傳送到該可用計(jì)算節(jié)點(diǎn)。
4、順序處理數(shù)據(jù)、避免隨機(jī)訪問(wèn)數(shù)據(jù)(Process data sequentially and avoid random access)
大規(guī)模數(shù)據(jù)處理的特點(diǎn)決定了大量的數(shù)據(jù)記錄不可能存放在內(nèi)存、而只可能放在外存中進(jìn)行處理。磁盤(pán)的順序訪問(wèn)和隨即訪問(wèn)在性能上有巨大的差異
例:100億(1010)個(gè)數(shù)據(jù)記錄(每記錄100B,共計(jì)1TB)的數(shù)據(jù)庫(kù)
更新1%的記錄(一定是隨機(jī)訪問(wèn))需要1個(gè)月時(shí)間;而順序訪問(wèn)并重寫(xiě)所有數(shù)據(jù)記錄僅需1天時(shí)間!
MapReduce設(shè)計(jì)為面向大數(shù)據(jù)集批處理的并行計(jì)算系統(tǒng),所有計(jì)算都被組織成很長(zhǎng)的流式操作,以便能利用分布在集群中大量節(jié)點(diǎn)上磁盤(pán)集合的高傳輸帶寬。5、為應(yīng)用開(kāi)發(fā)者隱藏系統(tǒng)層細(xì)節(jié)(Hide system-level details from the application developer)
軟件工程實(shí)踐指南中,專業(yè)程序員認(rèn)為之所以寫(xiě)程序困難,是因?yàn)槌绦騿T需要記住太多的編程細(xì)節(jié)(從變量名到復(fù)雜算法的邊界情況處理),這對(duì)大腦記憶是一個(gè)巨大的認(rèn)知負(fù)擔(dān),需要高度集中注意力而并行程序編寫(xiě)有更多困難,如需要考慮多線程中諸如同步等復(fù)雜繁瑣的細(xì)節(jié),由于并發(fā)執(zhí)行中的不可預(yù)測(cè)性,程序的調(diào)試查錯(cuò)也十分困難;大規(guī)模數(shù)據(jù)處理時(shí)程序員需要考慮諸如數(shù)據(jù)分布存儲(chǔ)管理、數(shù)據(jù)分發(fā)、數(shù)據(jù)通信和同步、計(jì)算結(jié)果收集等諸多細(xì)節(jié)問(wèn)題MapReduce提供了一種抽象機(jī)制將程序員與系統(tǒng)層細(xì)節(jié)隔離開(kāi)來(lái),程序員僅需描述需要計(jì)算什么(what to compute), 而具體怎么去做(how to compute)就交由系統(tǒng)的執(zhí)行框架處理,這樣程序員可從系統(tǒng)層細(xì)節(jié)中解放出來(lái),而致力于其應(yīng)用本身計(jì)算問(wèn)題的算法設(shè)計(jì)
6、平滑無(wú)縫的可擴(kuò)展性(Seamless scalability)
主要包括兩層意義上的擴(kuò)展性:數(shù)據(jù)擴(kuò)展和系統(tǒng)規(guī)模擴(kuò)展。理想的軟件算法應(yīng)當(dāng)能隨著數(shù)據(jù)規(guī)模的擴(kuò)大而表現(xiàn)出持續(xù)的有效性,性能上的下降程度應(yīng)與數(shù)據(jù)規(guī)模擴(kuò)大的倍數(shù)相當(dāng)在集群規(guī)模上,要求算法的計(jì)算性能應(yīng)能隨著節(jié)點(diǎn)數(shù)的增加保持接近線性程度的增長(zhǎng)絕大多數(shù)現(xiàn)有的單機(jī)算法都達(dá)不到以上理想的要求;把中間結(jié)果數(shù)據(jù)維護(hù)在內(nèi)存中的單機(jī)算法在大規(guī)模數(shù)據(jù)處理時(shí)很快失效;從單機(jī)到基于大規(guī)模集群的并行計(jì)算從根本上需要完全不同的算法設(shè)計(jì)奇妙的是,MapReduce幾乎能實(shí)現(xiàn)以上理想的擴(kuò)展性特征。? 多項(xiàng)研究發(fā)現(xiàn)基于MapReduce的計(jì)算性能可隨節(jié)點(diǎn)數(shù)目增長(zhǎng)保持近似于線性的增長(zhǎng)
總結(jié)
以上是生活随笔為你收集整理的MapReduce原理与设计思想(转载:http://blog.jobbole.com/80619/)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 支付宝拉黑和删除的区别
- 下一篇: 特斯拉2020年完成50万交付目标