欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

MapReduce 模式、算法和用例

系統(tǒng) 2330 0

在這篇文章里總結(jié)了幾種網(wǎng)上或者論文中常見的MapReduce模式和算法,并系統(tǒng)化的解釋了這些技術(shù)的不同之處。所有描述性的文字和代碼都使用了標(biāo)準(zhǔn)hadoop的MapReduce模型,包括Mappers, Reduces, Combiners, Partitioners,和 sorting。如下圖所示。

MapReduce 模式、算法和用例

基本MapReduce模式

計(jì)數(shù)與求和

問題陳述:

有許多文檔,每個(gè)文檔都有一些字段組成。需要計(jì)算出每個(gè)字段在所有文檔中的出現(xiàn)次數(shù)或者這些字段的其他什么統(tǒng)計(jì)值。例如,給定一個(gè)log文件,其中的每條記錄都包含一個(gè)響應(yīng)時(shí)間,需要計(jì)算出平均響應(yīng)時(shí)間。

解決方案:

讓我們先從簡(jiǎn)單的例子入手。在下面的代碼片段里,Mapper每遇到指定詞就把頻次記1,Reducer一個(gè)個(gè)遍歷這些詞的集合然后把他們的頻次加和。

      
1 class Mapper 2 method Map(docid id, doc d) 3 for all term t in doc d do 4 Emit(term t, count 1 ) 5 6 class Reducer 7 method Reduce(term t, counts [c1, c2,...]) 8 sum = 0 9 for all count c in [c1, c2,...] do 10 sum = sum + c 11 Emit(term t, count sum)

這種方法的缺點(diǎn)顯而易見,Mapper提交了太多無意義的計(jì)數(shù)。它完全可以通過先對(duì)每個(gè)文檔中的詞進(jìn)行計(jì)數(shù)從而減少傳遞給Reducer的數(shù)據(jù)量:

      
1 class Mapper 2 method Map(docid id, doc d) 3 H = new AssociativeArray 4 for all term t in doc d do 5 H{t} = H{t} + 1 6 for all term t in H do 7 Emit(term t, count H{t})

如果要累計(jì)計(jì)數(shù)的的不只是單個(gè)文檔中的內(nèi)容,還包括了一個(gè)Mapper節(jié)點(diǎn)處理的所有文檔,那就要用到Combiner了:

      
1 class Mapper 2 method Map(docid id, doc d) 3 for all term t in doc d do 4 Emit(term t, count 1 ) 5 6 class Combiner 7 method Combine(term t, [c1, c2,...]) 8 sum = 0 9 for all count c in [c1, c2,...] do 10 sum = sum + c 11 Emit(term t, count sum) 12 13 class Reducer 14 method Reduce(term t, counts [c1, c2,...]) 15 sum = 0 16 for all count c in [c1, c2,...] do 17 sum = sum + c 18 Emit(term t, count sum)
應(yīng)用: Log 分析, 數(shù)據(jù)查詢

整理歸類

問題陳述 :

有一系列條目,每個(gè)條目都有幾個(gè)屬性,要把具有同一屬性值的條目都保存在一個(gè)文件里,或者把條目按照屬性值分組。 最典型的應(yīng)用是倒排索引。

解決方案:

解決方案很簡(jiǎn)單。 在 Mapper 中以每個(gè)條目的所需屬性值作為 key,其本身作為值傳遞給 Reducer。 Reducer 取得按照屬性值分組的條目,然后可以處理或者保存。如果是在構(gòu)建倒排索引,那么 每個(gè)條目相當(dāng)于一個(gè)詞而屬性值就是詞所在的文檔ID。

應(yīng)用: 倒排索引, ETL

過濾 (文本查找),解析和校驗(yàn)

問題陳述:

假設(shè)有很多條記錄,需要從其中找出滿足某個(gè)條件的所有記錄,或者將每條記錄傳換成另外一種形式(轉(zhuǎn)換操作相對(duì)于各條記錄獨(dú)立,即對(duì)一條記錄的操作與其他記錄無關(guān))。像文本解析、特定值抽取、格式轉(zhuǎn)換等都屬于后一種用例。

解決方案:

非常簡(jiǎn)單,在Mapper 里逐條進(jìn)行操作,輸出需要的值或轉(zhuǎn)換后的形式。

應(yīng)用: 日志分析,數(shù)據(jù)查詢,ETL,數(shù)據(jù)校驗(yàn)

分布式任務(wù)執(zhí)行

問題陳述:

大型計(jì)算可以分解為多個(gè)部分分別進(jìn)行然后合并各個(gè)計(jì)算的結(jié)果以獲得最終結(jié)果。

解決方案: 將數(shù)據(jù)切分成多份作為每個(gè) Mapper 的輸入,每個(gè)Mapper處理一份數(shù)據(jù),執(zhí)行同樣的運(yùn)算,產(chǎn)生結(jié)果,Reducer把多個(gè)Mapper的結(jié)果組合成一個(gè)。

案例研究: 數(shù)字通信系統(tǒng)模擬

像 WiMAX 這樣的數(shù)字通信模擬軟件通過系統(tǒng)模型來傳輸大量的隨機(jī)數(shù)據(jù),然后計(jì)算傳輸中的錯(cuò)誤幾率。 每個(gè) Mapper 處理樣本 1/N 的數(shù)據(jù),計(jì)算出這部分?jǐn)?shù)據(jù)的錯(cuò)誤率,然后在 Reducer 里計(jì)算平均錯(cuò)誤率。

應(yīng)用: 工程模擬,數(shù)字分析,性能測(cè)試

排序

問題陳述:

有許多條記錄,需要按照某種規(guī)則將所有記錄排序或是按照順序來處理記錄。

解決方案: 簡(jiǎn)單排序很好辦 – Mappers 將待排序的屬性值為鍵,整條記錄為值輸出。 不過實(shí)際應(yīng)用中的排序要更加巧妙一點(diǎn), 這就是它之所以被稱為MapReduce 核心的原因(“核心”是說排序?因?yàn)樽C明Hadoop計(jì)算能力的實(shí)驗(yàn)是大數(shù)據(jù)排序?還是說Hadoop的處理過程中對(duì)key排序的環(huán)節(jié)?)。在實(shí)踐中,常用組合鍵來實(shí)現(xiàn)二次排序和分組。

MapReduce 最初只能夠?qū)︽I排序, 但是也有技術(shù)利用可以利用Hadoop 的特性來實(shí)現(xiàn)按值排序。想了解的話可以看 這篇博客

按照BigTable的概念,使用 MapReduce來對(duì)最初數(shù)據(jù)而非中間數(shù)據(jù)排序,也即保持?jǐn)?shù)據(jù)的有序狀態(tài)更有好處,必須注意這一點(diǎn)。換句話說,在數(shù)據(jù)插入時(shí)排序一次要比在每次查詢數(shù)據(jù)的時(shí)候排序更高效。

應(yīng)用: ETL,數(shù)據(jù)分析

非基本 MapReduce 模式

迭代消息傳遞 (圖處理)

問題陳述:

假設(shè)一個(gè)實(shí)體網(wǎng)絡(luò),實(shí)體之間存在著關(guān)系。 需要按照與它比鄰的其他實(shí)體的屬性計(jì)算出一個(gè)狀態(tài)。這個(gè)狀態(tài)可以表現(xiàn)為它和其它節(jié)點(diǎn)之間的距離, 存在特定屬性的鄰接點(diǎn)的跡象, 鄰域密度特征等等。

解決方案:

網(wǎng)絡(luò)存儲(chǔ)為系列節(jié)點(diǎn)的結(jié)合,每個(gè)節(jié)點(diǎn)包含有其所有鄰接點(diǎn)ID的列表。按照這個(gè)概念,MapReduce 迭代進(jìn)行,每次迭代中每個(gè)節(jié)點(diǎn)都發(fā)消息給它的鄰接點(diǎn)。鄰接點(diǎn)根據(jù)接收到的信息更新自己的狀態(tài)。當(dāng)滿足了某些條件的時(shí)候迭代停止,如達(dá)到了最大迭代次數(shù)(網(wǎng)絡(luò)半徑)或兩次連續(xù)的迭代幾乎沒有狀態(tài)改變。從技術(shù)上來看,Mapper 以每個(gè)鄰接點(diǎn)的ID為鍵發(fā)出信息,所有的信息都會(huì)按照接受節(jié)點(diǎn)分組,reducer 就能夠重算各節(jié)點(diǎn)的狀態(tài)然后更新那些狀態(tài)改變了的節(jié)點(diǎn)。下面展示了這個(gè)算法:

      
1 class Mapper 2 method Map(id n, object N) 3 Emit(id n, object N) 4 for all id m in N.OutgoingRelations do 5 Emit(id m, message getMessage(N)) 6 7 class Reducer 8 method Reduce(id m, [s1, s2,...]) 9 M = null 10 messages = [] 11 for all s in [s1, s2,...] do 12 if IsObject(s) then 13 M = s 14 else // s is a message 15 messages.add(s) 16 M.State = calculateState(messages) 17 Emit(id m, item M)

一個(gè)節(jié)點(diǎn)的狀態(tài)可以迅速的沿著網(wǎng)絡(luò)傳全網(wǎng),那些被感染了的節(jié)點(diǎn)又去感染它們的鄰居,整個(gè)過程就像下面的圖示一樣:


MapReduce 模式、算法和用例

案例研究: 沿分類樹的有效性傳遞

問題陳述:

這個(gè)問題來自于真實(shí)的電子商務(wù)應(yīng)用。將各種貨物分類,這些類別可以組成一個(gè)樹形結(jié)構(gòu),比較大的分類(像男人、女人、兒童)可以再分出小分類(像男褲或女裝),直到不能再分為止(像男式藍(lán)色牛仔褲)。這些不能再分的基層類別可以是有效(這個(gè)類別包含有貨品)或者已無效的(沒有屬于這個(gè)分類的貨品)。如果一個(gè)分類至少含有一個(gè)有效的子分類那么認(rèn)為這個(gè)分類也是有效的。我們需要在已知一些基層分類有效的情況下找出分類樹上所有有效的分類。

解決方案:

這個(gè)問題可以用上一節(jié)提到的框架來解決。我們咋下面定義了名為 getMessage和 calculateState 的方法:

      
1 class N 2 State in {True = 2 , False = 1 , null = 0 }, 3 initialized 1 or 2 for end - of - line categories, 0 otherwise 4 method getMessage( object N) 5 return N.State 6 method calculateState(state s, data [d1, d2,...]) 7 return max( [d1, d2,...] )

案例研究:廣度優(yōu)先搜索

問題陳述 需要計(jì)算出一個(gè)圖結(jié)構(gòu)中某一個(gè)節(jié)點(diǎn)到其它所有節(jié)點(diǎn)的距離。

解決方案: Source源節(jié)點(diǎn)給所有鄰接點(diǎn)發(fā)出值為0的信號(hào),鄰接點(diǎn)把收到的信號(hào)再轉(zhuǎn)發(fā)給自己的鄰接點(diǎn),每轉(zhuǎn)發(fā)一次就對(duì)信號(hào)值加1:

      
1 class N 2 State is distance, 3 initialized 0 for source node, INFINITY for all other nodes 4 method getMessage(N) 5 return N.State + 1 6 method calculateState(state s, data [d1, d2,...]) 7 min( [d1, d2,...] )

案例研究:網(wǎng)頁(yè)排名和 Mapper 端數(shù)據(jù)聚合

這個(gè)算法由Google提出,使用權(quán)威的PageRank算法,通過連接到一個(gè)網(wǎng)頁(yè)的其他網(wǎng)頁(yè)來計(jì)算網(wǎng)頁(yè)的相關(guān)性。真實(shí)算法是相當(dāng)復(fù)雜的,但是核心思想是權(quán)重可以傳播,也即通過一個(gè)節(jié)點(diǎn)的各聯(lián)接節(jié)點(diǎn)的權(quán)重的均值來計(jì)算節(jié)點(diǎn)自身的權(quán)重。

      
1 class N 2 State is PageRank 3 method getMessage( object N) 4 return N.State / N.OutgoingRelations.size() 5 method calculateState(state s, data [d1, d2,...]) 6 return ( sum([d1, d2,...]) )

要指出的是上面用一個(gè)數(shù)值來作為評(píng)分實(shí)際上是一種簡(jiǎn)化,在實(shí)際情況下,我們需要在Mapper端來進(jìn)行聚合計(jì)算得出這個(gè)值。下面的代碼片段展示了這個(gè)改變后的邏輯 (針對(duì)于 PageRank 算法):

      
1 class Mapper 2 method Initialize 3 H = new AssociativeArray 4 method Map(id n, object N) 5 p = N.PageRank / N.OutgoingRelations.size() 6 Emit(id n, object N) 7 for all id m in N.OutgoingRelations do 8 H{m} = H{m} + p 9 method Close 10 for all id n in H do 11 Emit(id n, value H{n}) 12 13 class Reducer 14 method Reduce(id m, [s1, s2,...]) 15 M = null 16 p = 0 17 for all s in [s1, s2,...] do 18 if IsObject(s) then 19 M = s 20 else 21 p = p + s 22 M.PageRank = p 23 Emit(id m, item M)
應(yīng)用: 圖分析,網(wǎng)頁(yè)索引

值去重 (對(duì)唯一項(xiàng)計(jì)數(shù))

問題陳述: 記錄包含值域F和值域 G,要分別統(tǒng)計(jì)相同G值的記錄中不同的F值的數(shù)目 (相當(dāng)于按照 G分組).

這個(gè)問題可以推而廣之應(yīng)用于分面搜索(某些電子商務(wù)網(wǎng)站稱之為Narrow Search)

        Record 1: F=1, G={a, b}
  Record 2: F=2, G={a, d, e}
  Record 3: F=1, G={b}
  Record 4: F=3, G={a, b}

  Result:
  a -> 3 // F=1, F=2, F=3
  b -> 2 // F=1, F=3
  d -> 1 // F=2
  e -> 1 // F=2
    

解決方案 I:

第一種方法是分兩個(gè)階段來解決這個(gè)問題。第一階段在Mapper中使用F和G組成一個(gè)復(fù)合值對(duì),然后在Reducer中輸出每個(gè)值對(duì),目的是為了保證F值的唯一性。在第二階段,再將值對(duì)按照G值來分組計(jì)算每組中的條目數(shù)。

第一階段:

      
1 class Mapper 2 method Map( null , record [value f, categories [g1, g2,...]]) 3 for all category g in [g1, g2,...] 4 Emit(record [g, f], count 1 ) 5 6 class Reducer 7 method Reduce(record [g, f], counts [n1, n2, ...]) 8 Emit(record [g, f], null )

第二階段:

      
1 class Mapper 2 method Map(record [f, g], null ) 3 Emit(value g, count 1 ) 4 5 class Reducer 6 method Reduce(value g, counts [n1, n2,...]) 7 Emit(value g, sum( [n1, n2,...] ) )

解決方案 II:

第二種方法只需要一次MapReduce 即可實(shí)現(xiàn),但擴(kuò)展性不強(qiáng)。算法很簡(jiǎn)單-Mapper 輸出值和分類,在Reducer里為每個(gè)值對(duì)應(yīng)的分類去重然后給每個(gè)所屬的分類計(jì)數(shù)加1,最后再在Reducer結(jié)束后將所有計(jì)數(shù)加和。這種方法適用于只有有限個(gè)分類,而且擁有相同F(xiàn)值的記錄不是很多的情況。例如網(wǎng)絡(luò)日志處理和用戶分類,用戶的總數(shù)很多,但是每個(gè)用戶的事件是有限的,以此分類得到的類別也是有限的。值得一提的是在這種模式下可以在數(shù)據(jù)傳輸?shù)絉educer之前使用Combiner來去除分類的重復(fù)值。

      
1 class Mapper 2 method Map( null , record [value f, categories [g1, g2,...] ) 3 for all category g in [g1, g2,...] 4 Emit(value f, category g) 5 6 class Reducer 7 method Initialize 8 H = new AssociativeArray : category -> count 9 method Reduce(value f, categories [g1, g2,...]) 10 [g1 ' , g2 ' ,..] = ExcludeDuplicates( [g1, g2,..] ) 11 for all category g in [g1 ' , g2 ' ,...] 12 H{g} = H{g} + 1 13 method Close 14 for all category g in H do 15 Emit(category g, count H{g})
應(yīng)用: 日志分析,用戶計(jì)數(shù)

互相關(guān)

問題陳述: 有多個(gè)各由若干項(xiàng)構(gòu)成的組,計(jì)算項(xiàng)兩兩共同出現(xiàn)于一個(gè)組中的次數(shù)。假如項(xiàng)數(shù)是N,那么應(yīng)該計(jì)算N*N。

這種情況常見于文本分析(條目是單詞而元組是句子),市場(chǎng)分析(購(gòu)買了此物的客戶還可能購(gòu)買什么)。如果N*N小到可以容納于一臺(tái)機(jī)器的內(nèi)存,實(shí)現(xiàn)起來就比較簡(jiǎn)單了。

配對(duì)法

第一種方法是在Mapper中給所有條目配對(duì),然后在Reducer中將同一條目對(duì)的計(jì)數(shù)加和。但這種做法也有缺點(diǎn):

  • 使用 combiners 帶來的的好處有限,因?yàn)楹芸赡芩许?xiàng)對(duì)都是唯一的
  • 不能有效利用內(nèi)存
      
1 class Mapper 2 method Map( null , items [i1, i2,...] ) 3 for all item i in [i1, i2,...] 4 for all item j in [i1, i2,...] 5 Emit(pair [i j], count 1 ) 6 7 class Reducer 8 method Reduce(pair [i j], counts [c1, c2,...]) 9 s = sum([c1, c2,...]) 10 Emit(pair[i j], count s)

Stripes Approach (條方法?不知道這個(gè)名字怎么理解)

第二種方法是將數(shù)據(jù)按照pair中的第一項(xiàng)來分組,并維護(hù)一個(gè)關(guān)聯(lián)數(shù)組,數(shù)組中存儲(chǔ)的是所有關(guān)聯(lián)項(xiàng)的計(jì)數(shù)。The second approach is to group data by the first item in pair and maintain an associative array (“stripe”) where counters for all adjacent items are accumulated. Reducer receives all stripes for leading item i, merges them, and emits the same result as in the Pairs approach.

  • 中間結(jié)果的鍵數(shù)量相對(duì)較少,因此減少了排序消耗。
  • 可以有效利用 combiners。
  • 可在內(nèi)存中執(zhí)行,不過如果沒有正確執(zhí)行的話也會(huì)帶來問題。
  • 實(shí)現(xiàn)起來比較復(fù)雜。
  • 一般來說, “stripes” 比 “pairs” 更快
      
1 class Mapper 2 method Map( null , items [i1, i2,...] ) 3 for all item i in [i1, i2,...] 4 H = new AssociativeArray : item -> counter 5 for all item j in [i1, i2,...] 6 H{j} = H{j} + 1 7 Emit(item i, stripe H) 8 9 class Reducer 10 method Reduce(item i, stripes [H1, H2,...]) 11 H = new AssociativeArray : item -> counter 12 H = merge - sum( [H1, H2,...] ) 13 for all item j in H.keys() 14 Emit(pair [i j], H{j})
應(yīng)用: 文本分析,市場(chǎng)分析
參考資料:Lin J. Dyer C. Hirst G. Data Intensive Processing MapReduce

用MapReduce 表達(dá)關(guān)系模式

在這部分我們會(huì)討論一下怎么使用MapReduce來進(jìn)行主要的關(guān)系操作。

篩選(Selection)

      
1 class Mapper 2 method Map(rowkey key, tuple t) 3 if t satisfies the predicate 4 Emit(tuple t, null )

投影(Projection)

投影只比篩選稍微復(fù)雜一點(diǎn),在這種情況下我們可以用Reducer來消除可能的重復(fù)值。

    
1 class Mapper 2 method Map(rowkey key, tuple t) 3 tuple g = project(t) // extract required fields to tuple g 4 Emit(tuple g, null ) 5 6 class Reducer

MapReduce 模式、算法和用例


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 视频在线一区二区 | 日韩欧美国产精品 | 国产成人av免费观看 | 日韩精品一二三区 | 欧美一级精品片在线看 | 国产一区二区三区久久久久久久久 | 国产毛片视频 | 国产视频三区 | 日韩欧美在线观看一区 | 99热这里有精品 | 99精品免费视频 | 日韩成人免费视频 | 天天干天天操天天射 | 素人视频在线观看免费 | 黄毛片 | 午夜福利视频 | 久久国产免费观看精品 | 亚洲欧洲日产国码在线观看 | 狠狠操社区 | 精品人妻无码一区二区三区手机板 | 日韩视频在线观看免费 | 欧美影院在线 | 欧美日本另类xxx乱大交 | 天天操天天摸天天爽 | 国产成人免费 | 国产一区久久精品 | 日韩在线短视频 | 成人福利视频 | 久久综合久色欧美综合狠狠 | 青娱乐伊人 | 精品国产一级毛片 | 欧美精品久久久 | 午夜视频福利在线 | 成人在线免费视频观看 | 亚洲不卡在线 | 一级片免费观看 | 女人被狂躁视频免费网站 | 日韩精品影院 | 久久精品国产一区二区电影 | 欧美视频免费 | 夜色伊人 |