Hadoop中特定键的值太多

时间:2015-08-10 05:20:27

标签: hadoop mapreduce

我在Hadoop上的MapReduce中编写了一个K-Means聚类代码。如果我的簇数很少,则考虑2,如果数据非常大,则整个数据将被分成两组,每个Reducer将接收特定键的太多值,即簇中心。怎么解决这个问题?

注意:我使用迭代的approch来计算新的中心。

2 个答案:

答案 0 :(得分:2)

从算法上讲,你可以做的并不多,因为这个算法的本质就是你所描述的算法。在这方面,唯一的选择是使用更多的集群并将数据划分为更多的减少器,但这会产生不同的结果。

所以,在我看来,你唯一能做的就是压缩。而且我不仅仅是指使用Hadoop的压缩编解码器。

例如,您可以找到数据的紧凑表示。例如,为每个元素提供一个整数id,并仅将此id传递给reducers。这将节省网络流量(将元素存储为VIntWritables,或定义您自己的VIntArrayWritable扩展ArrayWritable)和每个reducer的内存。

在这种k-means的情况下,我认为组合器不适用,但如果是,则会大大减少网络和减速器的开销。

编辑:如果您按照this iterative implementation,似乎可以使用合并器。请编辑您的问题以描述您已实施的算法。

答案 1 :(得分:-1)

如果你有太多的洗牌,那么你会遇到OOM问题。

尝试将数据集拆分为较小的块并尝试

yarn.app.mapreduce.client.job.retry间隔
和 mapreduce.reduce.shuffle.retry-delay.max.ms

哪里有更多分裂,但作业的重试时间足够长,因此没有OOM问题。