2017-08-11 7 views
0

最後の減速の速度は非常に遅いです。もう1つは減らす 私のマップの数を減らします。 マップの数は18784です。減らす数は1500です。 それぞれの平均時間は約1分26秒に短縮されますが、最後の削減は約2時間です 削減の数を変更し、ジョブのサイズを縮小する。しかし、私は似たような経験を持っていた私のパーティションMapReduceで最後の減速材が非常に遅い

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

用として何も

the last reduce を変更していない、私の場合、すべてのデータを処理していた減らすだけのためでした。これは、データの歪みのために発生します。既に処理されているレデューサーと、多くの時間を費やしているレデューサーを見てみると、多くの時間を費やしているレデューサーがより多くのデータを処理しているように見えます。

これを調べるとよいでしょう。非常に、おそらくあなたはスキューデータの問題に直面している

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)); 
} 

}

関連する問題