我目前正在閱讀一篇論文,並且我已經到了一個地步,作家們說,他們在每個地圖任務的內存中都有一些數組,當地圖任務結束時,他們會輸出該數組。Hadoop:是否可以在map函數的內存結構中進行聚合?
這是我指的是紙:http://research.google.com/pubs/pub36296.html
這個有點看起來有點非MapReduce的事情,但我想實現這個項目,我已經來到了一個點是這樣的解決方案我已經嘗試了很多方法來使用通用映射減少哲學,它處理每一行並輸出一個鍵 - 值對,但這樣我就可以爲每一行輸入數千個上下文寫入,並且需要很長時間才能寫入他們。所以我的地圖任務是一個瓶頸。這些上下文寫入花費了很多。
如果我這樣做,我會設法大幅減少鍵值對的數量。所以我需要找到一種方法來在每個地圖任務的內存結構中使用。 我可以在設置功能中將這些結構定義爲靜態,但我可以找到一種方法來告知地圖任務何時結束,以便我可以輸出該結構。我知道這聽起來有點奇怪,但它是有效工作的唯一方法。
這是他們在紙
在啓動時說的話,每一個映射器將裝入被 考慮每個有序屬性分割點的。對於每個節點n∈N 和屬性X,映射器維護鍵值對的表Tn,X.
處理所有輸入數據後,映射器OUT-形式的n 放鍵,X和值v,TN,X [V]
這裏是肖恩的回答後,一些編輯:
我在工作中使用組合器。問題在於,我的map函數中的這些context.write(Text,Text)命令非常耗時。我的輸入是csv文件或arff文件。每一行都有一個例子。我的示例可能具有多達數千個屬性。我輸出每個屬性,鍵值對的形式爲<(n,X,u),Y>,其中是節點的名稱(我正在構建決策樹),X是屬性的名稱, u是屬性的值,Y是文本格式的一些統計數據。正如你所看到的,如果我有100,000個屬性,我將不得不爲每個例子都有100,000個context.write(文本,文本)命令。在沒有這些命令的情況下運行我的地圖任務,它像風一樣運行。如果我添加context.write命令,則需要永久。即使是200,000個屬性訓練集。這看起來好像我在寫文件而不是在內存中。所以我真的需要減少這些寫入。將它們聚集在內存中(在map函數中而不在組合器中)是必要的。
是的,這正是我想要的。彙總並輸出到減速器(也可能有一個組合器)。關閉似乎是一個好的解決方案。是的,有靜態變量可能會導致一些問題。感謝您指出了這一點。所以我會盡量做一些像context.write內關閉(我剛剛檢查它被稱爲清理)。我會告訴你,如果工作。我只是嘗試寫一些較小的文本變量,它變得更快。感謝你的答案。他們不能更有幫助。 – jojoba 2012-03-01 01:24:28
好吧,我做到了。這完全是本文描述它的方式。它要快得多。我仍然需要優化我的代碼,它會沒事的。非常感謝您的建議 – jojoba 2012-03-01 05:11:24