仅报告mapReduce作业的mapper中的k个最低值

时间:2012-07-24 00:44:11

标签: java hadoop mapreduce report

我正在编写一个mapReduce作业,它从一个距离点最远的巨大数据集中查找k个对象。

在我的映射器中,我只想报告该数据块的距离最小的k对象。这样,我为每个数据块都有k中间(键,值),其中键是距离,值是object_id。所以在我的reducer()中,我可以轻松地处理和总结k个最低值。

我想不出一种只报告k对象的中间键值对的方法,该对象与mapper类中一个数据块的点的距离最小?

我知道我可以返回该数据块中所有输入数据的中间键值对(distance,obj_id),然后在我的reducer类中减少它并得到相同的结果。但是k <&lt; (每个数据块中的数据数量)并且通过仅报告k个中间键值而不是全部,我可以显着减少数据传输/混洗量。

感谢任何帮助

感谢

1 个答案:

答案 0 :(得分:2)

假设k很小(你可以在内存中容纳这个数量的对象),那么这应该很容易:

  • 创建一个包含两个实例变量的包装器/容器对象 - 计算出的距离(float / double?)和object_id(Text?)
  • 有许多可能的方法来维护一组固定的值,但是对于这个例子,我们使用TreeSet(你的包装器对象类型)
  • 确保您的包装器对象实现Comparable接口,或创建可由TreeSet用于确定顺序的Comparator实现 - 实现应首先比较距离实例变量,如果它们相同,则比较对象ID(这会产生一个有趣的问题 - 如果你想保留最小的10个值,你想要发生什么,但是有20个值都有最小的距离 - 你想保留10个?)
  • 在映射器中处理值时,计算距离值,如果树集大小小于K,或者距离小于集合的尾值距离,则添加此距离/ obj_id对(要么创建)如果设置的大小小于k,或者驱逐尾值并重新使用它来托管新的distance / obj id(请务必将其从集合中移除,修改值,然后重新设置)添加)
  • 在mapper的清理方法中,一次输出一组树值。