• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            MapReduce原理

            轉(zhuǎn)載自:http://www.cnblogs.com/wildman/archive/2008/08/22/1274175.html

            我們?yōu)槭裁匆P(guān)注MapReduce?

            1.什么是MapReduce?

                   MapReduce 是由Google公司的Jeffrey Dean  Sanjay Ghemawat 開發(fā)的一個針對大規(guī)模群組中的海量數(shù)據(jù)處理的分布式編程模型。MapReduce實現(xiàn)了兩個功能。Map把一個函數(shù)應(yīng)用于集合中的所有成員,然后返回一個基于這個處理的結(jié)果集。而Reduce是把從兩個或更多個Map中,通過多個線程,進(jìn)程或者獨(dú)立系統(tǒng)并行執(zhí)行處理的結(jié)果集進(jìn)行分類和歸納。Map()  Reduce() 兩個函數(shù)可能會并行運(yùn)行,即使不是在同一的系統(tǒng)的同一時刻。

                    Google MapReduce來索引每個抓取過來的Web頁面。它取代了2004開始試探的最初索引算法,它已經(jīng)證明在處理大量和非結(jié)構(gòu)化數(shù)據(jù)集時更有效。用不同程序設(shè)計語言實現(xiàn)了多個MapReduce,包括 Java, C++, Python, Perl, RubyC, 其它語言。在某些范例里,如Lisp或者Python, Map() Reduce()已經(jīng)集成到語言自身的結(jié)構(gòu)里面。通常,這些函數(shù)可能會如下定義:

            List2 map(Functor1, List1);
            Object reduce(Functor2, List2);

             

            Map()函數(shù)把大數(shù)據(jù)集進(jìn)行分解操作到兩個或更多的小“桶”。而一個“桶”則是包含松散定義的邏輯記錄或者文本行的集合。每個線程,處理器或者系統(tǒng)在獨(dú)立的“桶”上執(zhí)行Map()函數(shù),去計算基于每個邏輯記錄處理的一系列中間值。合并的結(jié)果值就會如同是單個Map()函數(shù)在單個“桶”上完全一致。Map()函數(shù)的通常形式是:

             map(function, list) {
              foreach element in list {
                v = function(element)
                intermediateResult.add(v)
              }
            } // map

             

            Reduce()函數(shù)把從內(nèi)存,磁盤或者網(wǎng)絡(luò)介質(zhì)提取過來的一個或多個中間結(jié)果列表,對列表中的每個元素逐一執(zhí)行一個函數(shù)。完成操作的最終結(jié)果是通過對所有運(yùn)行reduce()操作的處理結(jié)果進(jìn)行分類和解釋。Reduce()函數(shù)的通常形式是:

             reduce(function, list, init) {
              result = init
              foreach value in list {
                result = function(result, value)
              }
              outputResult.add(result)
            }

            MapReduce的實現(xiàn)把業(yè)務(wù)邏輯從多個處理邏輯中分離出來了,map()reduce()函數(shù)跨越多個系統(tǒng),通過共享池和部分RPC的形式來達(dá)到彼此之間的同步和通信。這里的業(yè)務(wù)邏輯是由用戶自定義的函數(shù)子實現(xiàn),并且這些函數(shù)子只能用在邏輯記錄處理的工作上,而不用關(guān)心多個處理操作的問題。這樣一旦MapReduce框架就位,就能通過大量的處理器快速的轉(zhuǎn)變?yōu)閼?yīng)用系統(tǒng)的并行處理。因為開發(fā)人員可以把精力花在寫函數(shù)子上面了。MapReduce簇可以通過替換函數(shù)子和提供新的數(shù)據(jù)源來重新使用,而無需每次都對整個應(yīng)用進(jìn)行編譯,測試和部署。

             

            2.實現(xiàn)MapReduce

                   MapReduce()的目的是為了大型集群的系統(tǒng)能在大數(shù)據(jù)集上進(jìn)行并行工作。

            1顯示了一個運(yùn)行在一個主系統(tǒng)上的主程序,協(xié)調(diào)其它實例進(jìn)行map()或者reduce()操作,然后從每個reduce操作中收集結(jié)果。

            【圖 1

             

            主應(yīng)用程序負(fù)責(zé)把基礎(chǔ)的數(shù)據(jù)集分解到“桶”中。桶的最佳大小依賴于應(yīng)用,結(jié)點(diǎn)的數(shù)量和可用的I/O帶寬。這些“桶”通常存儲在磁盤,但有必要也可能分散到主存中,這依賴于具體的應(yīng)用。“桶”將作為map()函數(shù)的輸入。

                   主應(yīng)用程序也負(fù)責(zé)調(diào)度和分散幾個MapReduce的核心備份,除了控制者給空閑的處理器或線程分配了調(diào)整map()reduce()任務(wù)之外,它們是完全相致的。控制者會持續(xù)跟蹤每個map()reduce()任務(wù)的狀態(tài),并且可以作為map()reduce()任務(wù)之間路由中間結(jié)果的管道。每個map() 任務(wù)處理器完全指派給“桶”,然后產(chǎn)生一個存到共享存儲區(qū)域的中間結(jié)果集。共享存儲可以設(shè)計成分布緩存,磁盤或其它設(shè)備等形式。當(dāng)一個新的中間結(jié)果寫入共享存儲區(qū)域后,任務(wù)就向控制者發(fā)出通知,并提供指向其共享存儲位置的句柄。

                   當(dāng)新的中間結(jié)果可用時,控制者分配reduce()任務(wù)。這個任務(wù)通過應(yīng)用獨(dú)立的中間鍵值來實現(xiàn)排序,使相同的數(shù)據(jù)能聚集在一起,以提供更快的檢索。大塊的結(jié)果集可以進(jìn)行外部排序,reduce()任務(wù)遍歷整個排序的數(shù)據(jù),把每個唯一的鍵和分類的結(jié)果傳遞到用戶的reduce() 函數(shù)子進(jìn)行處理。

                  通過map()reduce()實例終端的處理,當(dāng)所有的“桶”都用完,然后全部的reduce()任務(wù)就通知控制者,以說明它們的結(jié)果已經(jīng)產(chǎn)生了。控制者就向主應(yīng)用程序發(fā)出檢索這個結(jié)果的信號。主應(yīng)用程序可能就直接操作這些結(jié)果,或者重新分配到不同的MapReduce控制者和任務(wù)進(jìn)行進(jìn)一步的處理,

                   顯示情況下MapReduce的實現(xiàn)可能通常分配給控制者,map()reduce()任務(wù)分配給單獨(dú)的系統(tǒng)。Google操作模型是基于跨越大量的廉價硬件設(shè)備上組成的集群或者白盒子上面部署MapReduce應(yīng)用。為了處理它自己的桶的需要,每個白盒子都有本地存儲裝置,一個合理數(shù)量的私有內(nèi)存(24GB RAM)和至少兩個處理內(nèi)核。白盒子是可互相交換的,主應(yīng)用程序可能把集群中的任何機(jī)器指派為控制者,而這個機(jī)器就把map()reduce()任務(wù)分派給其它連接的白盒子。

             

            3.基于JavaMapReduce 實現(xiàn)

                   Google的環(huán)境是為它自己的需求定制和適應(yīng)它們的操作環(huán)境。比如,為了它的MapReduce實現(xiàn)更好的執(zhí)行這種類型的操作,使其更優(yōu)化,Google使用了專有的文件系統(tǒng)用來存儲文件。相反,企業(yè)應(yīng)用系統(tǒng)都是建立在Java或類似的技術(shù)上面的,它們依賴于已有的文件系統(tǒng),通信協(xié)議和應(yīng)用棧。

                   一個基于JavaMapReduce實現(xiàn)應(yīng)該考慮到已存在的數(shù)據(jù)存儲設(shè)備,將來部署到的結(jié)構(gòu)里面支持那種協(xié)議,有哪些內(nèi)部API和支持部署那種第三方產(chǎn)品(開源的或商業(yè)的)。圖2顯示了通常的架構(gòu)是如何通過映射到已有的、健壯的Java開源架構(gòu)來實現(xiàn)的。

            【圖 2

            這個架構(gòu)采用了已有的工具,比如TerracottaMule,它們經(jīng)常出現(xiàn)在很多企業(yè)系統(tǒng)的組織里面。已物理或虛擬系統(tǒng)形成存在的白盒子通過有效簡單的配置和部署,設(shè)計成MapReduce群組中的一部分。為了效率,一個很大的系統(tǒng)可以分解到幾個虛擬機(jī)器上,如果需要可以分配更多的結(jié)點(diǎn)。可以根據(jù)容量的問題和處理器的有效利用賴決定是否在群集中使用物理“白盒子”,虛擬機(jī)或者它們兩者的結(jié)合。

                   Terracotta 集群技術(shù)是map()reduce()任務(wù)之間共享數(shù)據(jù)的很好選擇,因為它把map()reduce()之間的通信過程,包括共享文件或者使用RPC調(diào)用已初始處理結(jié)構(gòu)都做了抽象。

            從前面章節(jié)的描述知道,Map()reduce()任務(wù)是在同一個核心應(yīng)用中實現(xiàn)的。用來共享中間結(jié)構(gòu)集的數(shù)據(jù)結(jié)構(gòu)可以保持在內(nèi)存的數(shù)據(jù)結(jié)構(gòu)中,通過Terracotta透明的共享交換。

                   由跨域集群的MapReduce產(chǎn)生的進(jìn)程內(nèi)通信問題,自從Terracotta運(yùn)行時掌管著這些共享數(shù)據(jù)結(jié)構(gòu)后就不存在了。不同于實現(xiàn)一個復(fù)雜的信號系統(tǒng),所有的map()任務(wù)需要標(biāo)記內(nèi)存中的中間結(jié)構(gòu)集,然后reduce()任務(wù)就直接提取它們。

                   控制者和主應(yīng)用程序都會在同時處在等待狀態(tài)一段時間,即使是MapReduce集群有大量可用的并行處理能力。這兩個組件之間以及當(dāng)歸并完成后的reduce()任務(wù)和控制者之間,都是通過MuleESB傳遞信號的。通過這種方式,為了其它應(yīng)用的處理,輸出結(jié)構(gòu)可以排到隊列,或者像前面章節(jié)講的一樣,為了其他MapReduced的處理,一個Mule服務(wù)對象(or UMO)可以把這些輸出結(jié)果分解到“桶”中。

                   通過主流的企業(yè)應(yīng)用協(xié)議或者完全的原始TCP/IP SocketsMule支持在內(nèi)存中進(jìn)行同步和異步的數(shù)據(jù)傳輸. Mule可以用于在同一臺機(jī)器執(zhí)行的應(yīng)用系統(tǒng),跨域不同的數(shù)據(jù)中心或者在完全不同地方且被程序員分開標(biāo)識的本地終端結(jié)點(diǎn)互相傳遞輸出結(jié)構(gòu)集。其它基于Java的實現(xiàn)可以通過Hadoop, 一個用于運(yùn)行應(yīng)用程序在大型集群的廉價硬件設(shè)備上的框架, 它是基于lucene框架。Hadoop是一個開源,點(diǎn)對點(diǎn),通用的MapReduce實現(xiàn)。

             

            4.結(jié)論

                   不管使用什么技術(shù),索引大量非結(jié)構(gòu)化數(shù)據(jù)是一件很艱難的任務(wù)。應(yīng)用傳統(tǒng)的算法和啟發(fā)式方法很難維護(hù),因為隨著時間的推移,系統(tǒng)的性能下降使系統(tǒng)變得難以控制。RDBMS 能有效的用于索引和檢索大量的結(jié)構(gòu)化數(shù)據(jù)集合,但不適合用于非結(jié)構(gòu)化的數(shù)據(jù)。MapReduce為并行系統(tǒng)的數(shù)據(jù)處理,提供了一個簡單,優(yōu)雅的解決方案,優(yōu)勢有:

            l         歸并成本

            l         程序員的高產(chǎn)出,因為用并行的代碼獨(dú)立實現(xiàn)了業(yè)務(wù)邏輯

            l         比傳統(tǒng)RDBMS技術(shù)更好的性能和更優(yōu)的結(jié)果。

            l         使用Java企業(yè)框架和開發(fā)人員都熟悉的已有的技術(shù)和工具更易部署

               

                MapReduce, Google有令人印象深刻的跟蹤記錄,而且每天出現(xiàn)的工具都能輕易的融入到這個體系中。在企業(yè)級的應(yīng)用系統(tǒng)中,如果你準(zhǔn)備開始一個快速,簡單的任務(wù),例如根據(jù)IP地址分析請求的擁堵模型到你的web集群中,或者類似的東西。一個這樣的練習(xí)將會很大程度上提高你對關(guān)鍵系統(tǒng)面臨的問題和挑戰(zhàn)的認(rèn)識,MapReduce則就是為這些而準(zhǔn)備的。

             

            英文原址:http://www.theserverside.com/tt/knowledgecenter-tc/knowledgecenter-tc.tss?l=MapReduce




            posted on 2014-06-10 00:12 楊粼波 閱讀(1727) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            国产精品成人久久久久久久| 久久久久高潮毛片免费全部播放 | 国产精品激情综合久久| 国产精品亚洲综合专区片高清久久久| 91久久福利国产成人精品| 久久久久久青草大香综合精品| 亚洲国产精品无码久久九九 | 久久人妻少妇嫩草AV无码蜜桃| 中文字幕无码av激情不卡久久| 一本久道久久综合狠狠爱| 久久不射电影网| 久久亚洲国产成人影院| 久久w5ww成w人免费| 国产综合精品久久亚洲| 久久久噜噜噜久久中文字幕色伊伊 | 久久国产免费| 韩国免费A级毛片久久| 欧美久久综合九色综合| 久久超碰97人人做人人爱| 亚洲七七久久精品中文国产| 91精品国产色综合久久| 久久中文字幕精品| 久久综合欧美成人| 久久久久亚洲Av无码专| 亚洲国产日韩欧美综合久久| 久久精品国产精品国产精品污| 亚洲精品国产第一综合99久久| 久久精品国产影库免费看| 色狠狠久久AV五月综合| 一本久久a久久精品综合香蕉| 日本免费一区二区久久人人澡 | 久久精品人人做人人爽电影| 超级碰久久免费公开视频| 久久天天躁狠狠躁夜夜网站| 日韩精品久久久久久久电影| 国产精品美女久久久免费| 精品久久久噜噜噜久久久 | 色综合久久久久综合体桃花网| 久久AⅤ人妻少妇嫩草影院| 国产婷婷成人久久Av免费高清| 97久久国产露脸精品国产|