最后一个reducer在mapreduce中非常慢

pxyaymoc  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(461)

最后一次减速的速度很慢。另一个减少我的Map的数量和减少是遵循Map的数量是18784,减少的数量是1500,平均每次减少的时间大约是1'26,但是最后一个减少的时间大约是2小时,我试图改变减少的数量和减少作业的大小。但一切都没变
最后一个是我的分区

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

a0x5cqrl1#

我也有类似的经历,在我的案例中,这是因为只有一个reduce在处理所有数据。这种情况的发生是由于数据偏斜。看看已经处理过的减速机和占用大量时间的减速机,您可能会看到更多的数据正在被占用大量时间的减速机处理。
你可能想调查一下。
hadoop在reducer中处理数据倾斜

zpjtge22

zpjtge222#

实际上,在处理大量数据时,应该设置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));
}

}

06odsfpq

06odsfpq3#

很可能您正面临数据倾斜问题。
或者您的密钥没有很好地分布,或者您的getpartition产生了问题。它ś 我不清楚为什么要从字符串的哈希代码创建一个字符串,然后获取这个新字符串的哈希代码。我的建议是,首先尝试使用默认分区,然后查看密钥的分布情况。

相关问题