来自内存的对象作为Hadoop / MapReduce的输入?

时间:2011-02-09 03:20:54

标签: hadoop mapreduce

我正在研究并行化算法,该算法大致如下:

  1. 阅读多个文本文档,总共10k字。
  2. 为文本语料库中的每个单词创建一个对象。
  3. 在所有单词对象之间创建一对(是,O(n))。并返回最频繁的对。
  4. 我想通过创建前1000个单词对象和第一台机器上的第二个1000个单词对象,以及下一台机器上的第二个1000个单词对象等来并行化3.步骤。

    我的问题是如何将2.步骤中创建的对象传递给Mapper?据我所知,我需要输入文件,因此需要序列化对象(虽然之前没有使用过)。有没有直接的方法将对象传递给Mapper?

    提前感谢您的帮助

    叶夫根

    更新 感谢您以前阅读我的问题。序列化似乎是解决此问题的最佳方法(请参阅java.io.Serializable)。此外,我发现本教程对于将序列化对象中的数据读入hadoop非常有用:http://www.cs.brown.edu/~pavlo/hadoop/)。

2 个答案:

答案 0 :(得分:0)

如何并行化所有步骤?使用#1文本文档作为Mapper的输入。为Mapper中的每个单词创建对象。在Mapper中,您的键值对将是单词 - 对象对(或对象 - 单词取决于您正在做什么)。然后,Reducer可以计算唯一对。

Hadoop将把所有相同的密钥组合到同一个Reducer中。

答案 1 :(得分:0)

使用twitter protobufs(elephant-bird)。将每个单词转换为protobuf对象,然后根据需要对其进行处理。与默认的java序列化相比,protobufs也更快更轻。请参阅Kevin Weil的演讲。 http://www.slideshare.net/kevinweil/protocol-buffers-and-hadoop-at-twitter