日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

简单解释 MapReduce 算法

發(fā)布時(shí)間:2023/12/2 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单解释 MapReduce 算法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一個(gè)有趣的例子

你想數(shù)出一摞牌中有多少?gòu)埡谔摇V庇^方式是一張一張檢查并且數(shù)出有多少?gòu)埵呛谔?#xff1f;

MapReduce方法則是:

  • 給在座的所有玩家中分配這摞牌

  • 讓每個(gè)玩家數(shù)自己手中的牌有幾張是黑桃,然后把這個(gè)數(shù)目匯報(bào)給你

  • 你把所有玩家告訴你的數(shù)字加起來(lái),得到最后的結(jié)論

  • 拆分

    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ù)睦印T谶@個(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ù)的主流方法。

    本文地址:http://www.cnblogs.com/archimedes/p/mapreduce-principle.html,轉(zhuǎn)載請(qǐng)注明源地址。

    Hadoop中的MapReduce

    大規(guī)模數(shù)據(jù)處理時(shí),MapReduce在三個(gè)層面上的基本構(gòu)思

    如何對(duì)付大數(shù)據(jù)處理:分而治之

    ? 對(duì)相互間不具有計(jì)算依賴(lài)關(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)的依賴(lài)關(guān)系!只能串行計(jì)算!?

    結(jié)論:不可分拆的計(jì)算任務(wù)或相互間有依賴(lài)關(guān)系的數(shù)據(jù)無(wú)法進(jìn)行并行計(jì)算!

    大數(shù)據(jù)的并行化計(jì)算

    ? 一個(gè)大數(shù)據(jù)若可以分為具有同樣計(jì)算過(guò)程的數(shù)據(jù)塊,并且這些數(shù)據(jù)塊之間不存在數(shù)據(jù)依賴(lài)關(guān)系,則提高處理速度的最好辦法就是并行計(jì)算

    ? 例如:假設(shè)有一個(gè)巨大的2維數(shù)據(jù)需要處理(比如求每個(gè)元素的開(kāi)立方),其中對(duì)每個(gè)元素的處理是相同的,并且數(shù)據(jù)元素間不存在數(shù)據(jù)依賴(lài)關(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的人工智能專(zhuān)家、圖靈獎(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中也提供了類(lèi)似于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):

    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ù)加1ht.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ù)):

    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)銷(xiāo),中間結(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)銷(xiāo),代之以把數(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í)踐指南中,專(zhuān)業(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)

    參考資料

    1、http://blog.jobbole.com/79255/

    2、《MapReduce簡(jiǎn)介》

    獲取更多C語(yǔ)言與算法相關(guān)知識(shí),關(guān)注公眾號(hào):“csuanfa”

    總結(jié)

    以上是生活随笔為你收集整理的简单解释 MapReduce 算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。