2015-10-01 61 views
0

我有一個Hadoop MapReduce作業,分割不同種類的文檔(地方,人員,組織,算法等)。對於每個文檔,我都有一個標籤,用於標識文檔的類型以及指向其他文檔的鏈接,但是我不知道該鏈接的文檔是哪種類型,直到該任務中鏈接的頁面到達。MapReduce過濾器之前減少

在Map階段中,我確定當前頁面的鏈接和種類,然後將Emmit作爲鏈接和當前文檔的信息以及他的標記到單個還原器,Key NullWritable Value「CurrentDoc :: Type ::鏈接」。

在縮減階段,它使用值的「CurrentDoc :: Type」按類型對所有文檔進行分組,然後發出僅屬於某些類型的「Document :: Link」之間的關係。

但是我有一個內存問題,因爲所有的最後一步只在一個reducer中執行。

這是一種在映射過程之後和減少任務之前執行分組任務以標識具有其標籤的所有文檔然後將其分發到不同的縮減器的方法。

我的意思是在ArrayWritable文本中將所有文檔/標記分組爲「CurrentDoc :: Type」。然後發送到reducers作爲「CurrentDoc :: Link」元組的關鍵字,並且值ArrayWritable以並行方式在reduce階段執行一些過濾。

感謝您的幫助!

+0

待辦事項接收到用於密鑰數據你使用組合函數?似乎在這裏很合適。 –

+0

Hi @ JackDaniel的,我讀過關於組合器,問題是組合器只處理一個映射器的數據,不能處理所有映射器的數據,這就是我需要的。感謝您的評論 – sebsasto

+0

只需嘗試發送「CurrentDoc :: Link」作爲鍵和「CurrentDoc :: Type」作爲映射器本身的值。 – madhu

回答

2

不幸的是,系統無法按照您的預期工作。

我們無法更改Mapper,Reducer &合併器功能。

Hadoop允許用戶指定要在地圖輸出上運行的組合器函數,組合器函數的輸出形成reduce函數的輸入。換句話說,調用組合器函數零次,一次或多次應該產生相同的減速器輸出。

合併器無法合併來自多個地圖的數據。讓我們把工作交給Reducer。

對於您的問題,

1)使用客戶分區程序,並決定哪些減速應被用來處理特定鍵(CurrentDoc ::類型

2)將結合數據在一個映射器

3)從映射器將重新定向取決於密鑰分區的特定減速(洗牌

4)減速將結合從各自映射器

Combiner

Working code of分區程序&合