2014-03-29 64 views
2

我想在我的Hadoop map reduce程序中爲我所有的Map函數保留一個通用的全局變量。這個變量在所有map函數內部都被重寫了,我該如何同步執行這個操作?Hadoop中所有節點的公共變量

回答

1

Hadoop是一種「無共享」體系結構,雖然有解決方法可以在映射器或簡化器之間共享某些數據,但無法保證同步。這就是說,如果你想嘗試,你可以使用工作臺來檢查價值。或者,您可以嘗試更改您的密鑰類型並將縮減器的數量設置爲1.然後,您可以保證所有數據都由單個系統看到,並可以在那裏應用您的計數器。但是,這取決於您的數據有多大。

+0

是謝謝,有1減速機是一種可能的解決方案,謝謝! –

+0

有一個reducer會減慢我的計算速度,如同在一個節點上處理一樣好,因爲地圖輸出必須排隊等待這個reducer? –

+0

是的,它會減慢你的計算速度,這就是爲什麼我說它的潛力作爲替代取決於你的數據集有多大減少。其中的一件事情,你必須決定權衡是否值得。 – TheCowGoesMoo

0

就像TheCowSaysMoo說的那樣,Hadoop沒有任何共享。您可以使用數據庫(如hbase)來獲取同步計數器。有關更多信息,請參閱increment。 我不知道這是不是對你所做的事情過度殺傷,但這是hbase的用途之一。

1

用戶定義的計數器是全球性的:Map-reduce框架在所有地圖上聚合 ,並減少在作業結束時產生總計。

創建驅動程序

public class Driver{ 
    enum Count { 
     TOTAL 
    } 
} 

添加計數器下面一行在你的映射器

context.getCounter(Count.TOTAL).increment(1); 

然後使用下面的代碼你job.submit後讀計數器的值()

Counters counters = job.getCounters(); 
long missing = counters.findCounter(
Driver.Count.MISSING).getValue(); 

這種方式使用計數器,你可以跟蹤你的全球計數器。根據我的理解,這應該服務你的目的。

+0

但是在這種方法中,Count是否同步呢? –

+0

基本上所有的增量細節將由TaskTracker發送給Jobtracker,一旦完成工作,它將合併增量。 –

+0

謝謝,但我的問題是我必須訪問我的映射器中遞增的變量的值! –