Hadoop会帮助解决以下问题:
我需要根据一些规则将1000GB的单词折叠成一个单词。例如:
fold("dog","cat") = "pet"
折叠单词的顺序并不重要。我想将所有数据分成几个块并首先在每个块中折叠单词。在那之后产生了单词。
问题:
1)使用Hadoop完成此任务是否有意义?
2)要创建多少块以及Hadoop有效工作的块大小应该是什么?
谢谢!
答案 0 :(得分:1)
我想我现在明白你的问题。为简单起见,请考虑一个示例,我们只需添加1000GB的整数(正如您所说的加法可以大致相当于您的fold()操作)。
因此Map / Reduce有两个阶段 - Map阶段对单个数据项(键,值对)进行操作,然后提供给可以进行聚合的Reduce阶段。由于您的整个操作是一个巨大的聚合,您可以使用Hadoop的身份Mapper和Combiner将聚合分解为几个较小的聚合。
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获取聚合数据,并将一个最终聚合到您的最终答案。