1. 程式人生 > >MapReduce 基礎演算法【單詞共現演算法】

MapReduce 基礎演算法【單詞共現演算法】

基本設計

設有一個英文語句:

wearenotwhatwewanttobebutatleastwearenotwhatweusedtobe.
  • 設共現視窗定義為連續出現的兩個單詞,如下圖給出上句英文的共現矩陣。

單詞共現演算法實現(虛擬碼)

Map端虛擬碼如下:

class Mapper 
    method Map(dociddid, doc d)
    for all word w 屬於 d
for all word u 屬於 Window(w)
//發射出現計數 1
        Emit
(pair (w, u), 1)

Reduce 端虛擬碼如下:

class Reducer
    method Reduce(pair p; countlist [c1, c2,..])
        s = 0
for all count c in countlist [c1, c2, ...]
s = s+ c
Emit(pair p, count s)
  • 上述Mapper虛擬碼中使用了一個window定義,表示如果單詞w的視窗u 屬於w的視窗內,則認為是(u,w)的一次出現。這裡的視窗Windows可以根據不同的應用需求有不同的定義,比例,可以定義為一個固定大小的視窗,或者是前者相連出現、在同義句中、在同一段落中出現的單詞等。
  • 例如,如果視窗中的單詞為[w1, w2, w3],我們發射((w1,w2),1)和((w1,w3),1)出去然後視窗向後移動一個單詞。REduce階段則對發來的相同鍵的值進行簡單的求和即可。這裡單詞順序有無關係需要看具體的情況而定。另外,在實際實現中我們需要傳入Map的資料時以一個文字為單位的,這裡需要實現一個WholeFileInputFormat以便一個文字唄拆分被整個傳入到一個Map節點。
  • 例如,

  • 在Map階段,一個Map節點接受到如圖所示的一個文件的內容,視窗大小為7,那麼首先視窗先覆蓋了

    MapReduceisanewtechniquetoprocessbigdata,然後,該結點將鍵值對((MapReduce,is),1),((MapReduce,a),1),((MapReduce,technique),1),((MapReduce,to),1),((MapReduce,process),1)發射出去。隨後視窗向後滑動一格,與上面相似,這時將((is,a),1),((is,new),1),((is,technique),1),((is,to),1),((is,process),1),((is,big),1),發射出去。最後再向後滑動一一個單詞至文件的末尾,與上面相似,傳送相應的鍵值對出去。當視窗尾部已經到達文件尾部時,滑動視窗則通過將視窗頭部向後“縮排”來進行,此過程一直進行到視窗大小為2停止。

單詞共現演算法實現中的細節問題

  • 發射出去的單詞對需要自定義以個WordPair類,該類需要實現WirtableComparable介面。需要重寫自定義類WordPair的hashCode()方法,使得相同的WordPair主鍵都被髮送到相同的Reduce節點去。另外,我們還需要重寫compareTo()和equals()方法使得相同的