Hadoop会帮助解决以下问题吗?
我需要根据一些规则将 1000GB 的单词折叠成一个单词。例如:
fold("dog","cat") = "pet"
单词按什么顺序折叠并不重要。我想将所有数据分成几个块,并首先在每个块中折叠单词。之后折叠结果的话。
问题:
1)使用Hadoop来完成这项任务有意义吗?
2)要创建多少块,Hadoop应该多大的块才能高效工作?
谢谢!
我现在明白你的问题了。 为了简单起见,考虑一个示例,我们将简单地添加 1000GB 的整数(正如您所说,加法大致相当于您的 fold() 操作)。
因此,Map/Reduce有两个阶段 - Map阶段对单个数据项(键,值对)进行操作,然后馈送到可以发生聚合的Reduce阶段。 由于您的整个操作是一个巨大的聚合,因此您可以使用Hadoop的标识映射器以及组合器将聚合分解为几个较小的聚合。
合路器基本上是一个化简器,它紧跟在作业的映射器之后运行。 它的想法是对退出 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 作业,让组合器在映射任务之后执行第一级聚合,然后有一个 Reducer 从组合器中获取聚合数据,并将一个最终聚合到您的最终答案中。