2012-04-05 12 views
1

這裏記錄的數量是用例:極限的所有減速器產生的統稱

輸入URL由地圖讀和以後出射後的一些過濾。然後分區器根據主機名對它們進行分區。

運行map-reduce作業後,我對輸出url有一個全侷限制。我平均分配所有減速器。 即。如果全侷限製爲1000,並且reducer的數量是5,那麼每個reducer最多會發送(1000/5 = 200)url作爲輸出

問題是,如果只有2個主機的urls(由於用戶輸入),並且這兩個主機中的每個主機都有10萬個URL,處理這些URL(同一主機,同一分區)的2個reducer將限制每個URL只輸出200個URL。 其他縮減器由於分區而沒有獲取任何數據進行處理,併發出0條記錄。

因此,即使我有100000個URL /主機和全侷限製爲1000,輸出只有400個URL(200個URL /主機)。

回答

1

如果您不需要按主機名進行分區,則可以通過隨機分區程序解決您的問題。

如果你必須按主機名分區,我不認爲有任何簡單的答案。每個reducer都不知道有多少記錄會來。每個減速器必須累積100000條記錄或儘可能多地收到它。你需要重寫你的reducer中的清理功能。 Reducers需要在「清理」功能中相互交談(可能是通過計數器),並決定需要多少記錄,並只在清理功能中寫出記錄。

你覺得呢?

+0

我必須按主機名進行分區,因爲來自同一主機的URL會分組在一起並簡化更多邏輯。清理功能是hadoop map-reduce流程的一部分還是您提出的機制?請詳細說明一下。 – 2012-04-05 17:41:39

+0

你可以在你的reducer類中覆蓋這個函數。在reduce函數中,您應該將記錄存儲在容器中而不是寫出來。在清理功能中,您可以進行通信並確定當前減速器需要寫出多少條記錄。在下面的頁面中查找清理函數int eh:http://hadoop.apache.org/common/docs/r0.20.2/api/org/apache/hadoop/mapreduce/Mapper.html – root1982 2012-04-08 02:41:06

1

Hadoop內置支持全球counters。您可以定義自己的計數器,並從您的映射器或減速器代碼中增加/讀取它們。

+0

謝謝。我會嘗試使用計數器。我認爲維護計數器(以一種共享變量的方式)將達到更大輸入的性能,但目前我沒有任何選擇。 – 2012-04-05 17:37:27