根据一个元素对整个Reducer值列表执行某些操作

时间:2011-03-28 17:37:16

标签: hadoop mapreduce

我有一个有趣的问题,我正在努力适应MapReduce。我有一堆日志条目。我需要做的是这样的事情:

检查给定IP的任何条目是否设置了特定标志。如果是,请将转换应用于具有该IP的所有条目,否则不进行转换。

执行此操作的最简单方法是关闭IP,然后在reducer中迭代一次,以检查是否有任何设置了该标志,并再次进行转换(如果需要)。不幸的是,似乎我只能迭代传递给reducer的Iterable一次。

我看到的可能解决方案是:

  1. 在reducer中,序列化我正在读取的值到磁盘,以便我可以懒得反序列化以便再次迭代。这看起来有点像黑客。
  2. 预先运行一些工作,生成要转换的IP列表,并将其存储在HBase中。这显然需要HBase,以及大量的网络通信。
  3. 我想坚持使用标准MapReduce,以便能够在Amazon Elastic MapReduce上轻松运行。我觉得应该通过链式工作来做到这一点,但我似乎无法想出任何东西。有没有人对我如何做到这一点有任何提示?

1 个答案:

答案 0 :(得分:2)

一种可能性:您的映射器可以输出复合键,其中包括IP地址和此特定标志的存在。然后,您需要确保在reducer中迭代的记录已排序,以便首先出现flag = true的记录。由于这些记录首先出现,因此您将知道将转换应用于该IP地址组中的所有记录。

以下是一篇博文,介绍了如何执行此操作:

http://www.riccomini.name/Topics/DistributedComputing/Hadoop/SortByValue/