2014-05-13 33 views
1

我目前正在研究一個Java EMR項目,其中我的密鑰由2個文本組成。 我在我的一個步驟中設置了NaturalKeyGroupingComparator,只比較鍵的左側部分。hadoop NaturalKeyGroupingComparator - Reducer中發生了什麼?

現在,這是對減速的Java代碼:

 public void reduce(Pair key, Iterable<Data> values, Context context) throws IOException, InterruptedException{ 

     int totalOccurrences=0; 
     for (Data value : values){ 

      if (key.getRight().toString().equals("*")){ 
       totalOccurrences+=value.getOccurrences(); 
      } 
      else{ 
       value.setCount(new IntWritable(totalOccurrences)); 
      } 
     } 

    } 

現在一切工作按計劃完全沒有問題,但我不明白這正是發生。 在減少運行中如何改變密鑰?

回答

2

你的問題是一個很好的初學者質疑:)

我已經寫它here

我想要記住的最重要的事情是Iterable是沒有集合的支持,它是在調用next()方法時即時計算的。請牢記這一點。

一旦你完成上述帖子,如果你想我看到的代碼類人。

//線number157

if (hasMore) { 
     nextKey = input.getKey(); 
     nextKeyIsSame = comparator.compare(currentRawKey.getBytes(), 0, 
            currentRawKey.getLength(), 
            nextKey.getData(), 
            nextKey.getPosition(), 
            nextKey.getLength() - nextKey.getPosition() 
             ) == 0; 
    } else { 
     nextKeyIsSame = false; 
    } 

這是從ReduceContextImpl

一個片段的方法,得到每次調用時,調用下一個(),它基本上檢查如果密鑰基礎流在改變如果不是,它只是傳遞給你下一個值(記住鍵是有序的),否則它會安排使用新鍵和迭代再次調用reducer方法。

基礎流始終是一個關鍵,值對,ReducerContextImpl給你它是一個關鍵,對收集的幻覺/抽象。

就像我在開始時說....

要記住最重要的事情是,可迭代是不是一個集合的支持,它是計算在飛行到什麼時候下一個( )方法被調用。請牢記這一點。

這個主題在MapReduce框架中很常見,所有的計算都是在流上完成的,沒有任何東西會完全加載到內存中,我花了一段時間纔得到這個:)因此渴望分享它。

1

reduce()方法對reducer輸入中的每個鍵組執行。 在當多個文本被用作關鍵字的一部分的情況下,鑰匙同時使用文本爲重點進行了分組,以便您的輸出將是

KeyGroup1,COUNT1

KeyGroup2,COUNT2現在

當分組僅在按鍵的左半部分基於改變,分組的減速也改變提供

NewKeyGroup1, count1 
NewKeyGroup2, count2 

輸出對於更深層次的理解經過權威指南第8章硒condary排序