0

Hadoop是否有助于解决以下问题:

我需要根据一些规则将 1000GB 的单词折叠成一个单词。例如:

 fold("dog","cat") = "pet"

单词的折叠顺序并不重要。我正在考虑将所有数据分成几个块,然后首先在每个块中折叠单词。之后折叠产生的单词。

问题:

1) 使用 Hadoop 来完成这项任务有意义吗?

2) 为了让 Hadoop 高效工作,要创建多少块以及应该有多大的块?

谢谢!

4

1 回答 1

1

我想我现在明白你的问题了。为简单起见,考虑一个示例,我们将简单地添加 1000GB 的整数(正如您所说的加法大致等同于您的 fold() 操作)。

因此 Map/Reduce 有两个阶段 - Map 阶段对单个数据项(键、值对)进行操作,然后馈送到可以发生聚合的 Reduce 阶段。由于您的整个操作是一个巨大的聚合,您可以使用 Hadoop 的身份映射器组合器将聚合分解为几个较小的聚合。

一个Combiner 基本上是一个在你的工作的Mapper 之后运行的Reducer。它的想法是对退出 Map 节点的数据进行聚合,以尽可能组合并减少通过网络发送到 Reduce 节点的数据量。

这是加法组合器的示例

  public class AddCombiner extends Reducer<SomeKey, IntWritable, SomeKey, IntWritable> {
     public void reduce(SomeKey key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException 
     {
       int total = 0;

       for (IntWritable value : values) 
       {
           total += value.get();
       }

       context.write(key, new IntWritable(total));
     }
   }

因此,您可以在 1000GB 的输入上运行 Map/Reduce 作业,让组合器在 Map 任务之后执行第一级聚合,然后让一个 Reducer 从组合器中获取聚合数据,并将最终聚合到您的最终答案中。

于 2013-10-11T01:38:17.423 回答