2013-02-07 67 views
0

這是我的問題。 我有一個大型數據集可以使用,而且我需要限制每個鍵的最大值。有時候我每個鍵有超過10000個值,這是我需要的。如何限制Hadoop中每個鍵的最大值?

那麼我怎樣才能配置我的作業,使每個鍵的'x'值? (任何關鍵)在減少階段後。

編輯:這是減少源代碼。我的主要問題是有時我會得到一個OutOfMemory,這是因爲StringBuilder變得巨大。

也許有一種方法可以通過配置來說「我只想要每個鍵有10.000個值」。如果不是這樣,我必須把一些額外的代碼在我的減速器...

public void reduce(Text domain, Iterable<Text> inLinks, Context context) throws IOException, 
      InterruptedException { 
     allInlinks = new StringBuilder(); 

     for (Text text : inLinks) { 

       allInlinks.append(text.toString()); 
       allInlinks.append(",");    
     } 

     allLinksText.set(allInlinks.toString()); 

     context.write(domain, allLinksText); 
    } 
+0

您是否想要減小減速機輸出的大小? –

+0

這個想法是限制與鍵值相關的輸出不是字節。 – psabbate

回答

2

我想你可能會混淆從減少相輸出的記錄形式(K,V),未(K ,{V,V,V})。現在,從Map階段輸出的記錄以(K,{V,V,V})的形式出現,並由縮減器來壓縮這些中間值,但它看起來合適。如果您正在運行自己的基於Java的MapReduce作業,則可以嘗試通過代碼限制每個階段輸出的記錄數量,但這並不完全符合bigdata範例。有關您的數據/當前解決方案/期望輸出的更多說明是必要的。

+0

我編輯了我原來的問題,謝謝! – psabbate

+0

@psabbate是否有可能在輸出字符串中有多個重複的inLinks?如果是這樣,這可能是減少輸出字符串大小的一種方法。我可以想到的另一種方法是將某種度量標準與inLinks關聯起來,然後只將這些inLinks附加到輸出字符串中高於/低於該度量標準的位置。 – ryanbwork

1

像這樣簡單的事情不行嗎?也許我不完全理解你的問題。

reduce(Key key, Iterator<Value> values) { 
    int count = 0; 
    while (values.hasNext()) { 
     if (count < x) { 
      // do whatever 
      count++; 
     } else { 
      return; 
     } 
    } 
} 

是的,有在所有針對每一個琴鍵仍在進行排序並複製到減速值的一些「垃圾」,但我真的不看周圍的一種方式。你可以在Combiner中做類似的事情,並且每個鍵只輸出x,但根據你的鍵/映射器的分佈情況,這只是有點幫助。

+0

是的,但我不想那樣做,也許有辦法通過配置來實現這一點。 – psabbate

+0

對不起,我不知道通過配置來完成它。通常,配置用於控制不能將自定義代碼注入到的進程的某些部分。例如,混洗/排序階段或Mapper/Reducer分配。由於您可以輕鬆地將任何您想要的邏輯添加到reducer中,因此在那裏提供的配置選項沒有太多。 –