我在Hadoop上的MapReduce中编写了一个K-Means聚类代码。如果我的簇数很少,则考虑2,如果数据非常大,则整个数据将被分成两组,每个Reducer将接收特定键的太多值,即簇中心。怎么解决这个问题?
注意:我使用迭代的approch来计算新的中心。
答案 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问题。