最后一次减速的速度很慢。另一个减少我的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;
}
3条答案
按热度按时间a0x5cqrl1#
我也有类似的经历,在我的案例中,这是因为只有一个reduce在处理所有数据。这种情况的发生是由于数据偏斜。看看已经处理过的减速机和占用大量时间的减速机,您可能会看到更多的数据正在被占用大量时间的减速机处理。
你可能想调查一下。
hadoop在reducer中处理数据倾斜
zpjtge222#
实际上,在处理大量数据时,应该设置combiner的类。如果你想改变编码你应该重置reduce函数。例如。
}
}
06odsfpq3#
很可能您正面临数据倾斜问题。
或者您的密钥没有很好地分布,或者您的getpartition产生了问题。它ś 我不清楚为什么要从字符串的哈希代码创建一个字符串,然后获取这个新字符串的哈希代码。我的建议是,首先尝试使用默认分区,然后查看密钥的分布情况。