2017-08-11 63 views
0

最後減速的速度非常慢。其他減少 我的地圖的數量和減少是如下 地圖的數量是18784,減少的數量是1500 平均每個減少約1'26時間,但最後減少約2小時 我試試改變減少的數量和減少工作的大小。但什麼都沒有改變最後減速器在MapReduce中非常緩慢

the last reduce 作爲我的分區

public int getPartition(Object key, Object value, int numPartitions) { 
    // TODO Auto-generated method stub 
    String keyStr = key.toString(); 
    int partId= String.valueOf(keyStr.hashCode()).hashCode(); 
    partId = Math.abs(partId % numPartitions); 
    partId = Math.max(partId, 0); 
    return partId; 
    //return (key.hashCode() & Integer.MAX_VALUE) % numPartitions; 
} 

回答

0

我有類似的經歷,在我的情況下,它是由於只有一個減少在做處理所有的數據。這是由於數據偏斜。看看已經處理的減速器櫃檯和需要花費大量時間的減速器櫃檯,您可能會看到更多的數據正在由需要花費大量時間的減速器處理。

你可能想看看這個。

Hadoop handling data skew in reducer

+0

謝謝。但是當我減少約10%數據的數據大小並更改分區器時,我得到的結果相同。最後的減少也很慢。 – yanzhuo

+0

您是否看到它處理了多少數據?它處理的數據是否比其他減速器更多? – user3330284

+0

謝謝。我找到原因。我忘了設置類SetCombinerClass – yanzhuo

0

很有可能你正面臨偏斜數據的問題。

或者您的密鑰分佈不均勻或您的getPartition正在產生問題。它並不清楚爲什麼你要從字符串的哈希碼創建一個字符串,然後得到這個新字符串的哈希碼。我的建議是,首先嚐試使用默認分區,然後查看你的密鑰分佈。

+0

謝謝。我嘗試一下。 – yanzhuo

0

事實上,當你處理大量的數據時,你應該設置Combiner的類。如果你想改變編碼,你應該重置Reduce功能。例如, 。

public class GramModelReducer extends Reducer<Text, LongWritable, Text, LongWritable> { 

private LongWritable result = new LongWritable(); 
public void reduce(Text key, Iterable<LongWritable> values,Context context) throws IOException, InterruptedException { 

     long sum = 0; 
     for (LongWritable val : values) { 
     sum += val.get(); 
     } 
     result.set(sum); 
     context.write(new Text(key.toString().getBytes("GB18030")), result); 
} 

}

class GramModelCombiner extends Reducer<Text, LongWritable, Text, LongWritable> { 
public void reduce(Text key, Iterable<LongWritable> values,Context context) throws IOException, InterruptedException { 

     long sum = 0; 
     for (LongWritable val : values) { 
     sum += val.get(); 
     } 
     context.write(key, new LongWritable(sum)); 
} 

}