2012-11-05 70 views
1

現在我想要創建一個全局雙變量(成員),可以通過MapReduce作業中的每個Mapper/Reducer來訪問和更改它。起初,我試圖在我的主要java文件中聲明一個靜態雙成員,但它似乎有問題,因爲每個映射器/ reducer在單獨的JVM上運行,並且可以正確更改和訪問該成員。如何在Hadoop MapReduce的Java實現中創建全局變量?

我知道int變量有counter機制。但是如果我想創建一個全局雙變量,我該怎麼做?

我的最終目標是總結一些在所有映射器/縮減器中都是雙格式的東西。如果我不能或不應該創建全局變量,是否有其他方法可以實現該目標?

+7

全局可變變量基本上與使用map/reduce可以完成的操作相反。甚至不要嘗試去做。即使你可以模仿它,這也會破壞map/reduce的整個目的,並停止並行化的生效。 –

+0

@LouisWasserman但是如果我想總結一些在mappers或reducer中是雙重的東西呢? – Denzel

+0

@LouisWasserman我已經將這些添加到問題中。 – Denzel

回答

2

這些雙打從哪裏來?如果他們在輸入數據中,則可以將其作爲正常的MR作業執行。讓您的映射器始終輸出相同的密鑰和要彙總的值。使用組合器在每個映射器中進行本地求和。然後只使用一個減速器,並只是發出總和。

「全局」狀態正是Map-Reduce範例試圖避免的。您必須嘗試將所有內容都考慮爲在不同的映射器中執行不同的工作部分,然後在減速器中進行組合/彙總。

1

其實你可以把雙像整數。您可以乘以100000的任何雙倍數並將其存儲在計數器中。在減速器中,如果您需要它,只需除以100000.

+0

是的。這很棘手。但是我認爲,由於這與分佈式計算的概念相反,我應該找到其他解決方案。 – Denzel

+0

我仍然不明白這是如何違反分佈式計算的概念。如果是這樣,那麼爲什麼櫃檯存在? +1這個答案 – vefthym