如何用Hadoop折叠TB级的单词?

时间:2013-10-10 22:40:33

标签: hadoop mapreduce

Hadoop会帮助解决以下问题:

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

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

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

问题:

1)使用Hadoop完成此任务是否有意义?

2)要创建多少块以及Hadoop有效工作的块大小应该是什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

我想我现在明白你的问题。为简单起见,请考虑一个示例,我们只需添加1000GB的整数(正如您所说的加法可以大致相当于您的fold()操作)。

因此Map / Reduce有两个阶段 - Map阶段对单个数据项(键,值对)进行操作,然后提供给可以进行聚合的Reduce阶段。由于您的整个操作是一个巨大的聚合,您可以使用Hadoop的身份MapperCombiner将聚合分解为几个较小的聚合。

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作业,让Combiners在Map任务之后执行第一级聚合,然后让一个Reducer从Combiners获取聚合数据,并将一个最终聚合到您的最终答案。