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

如何使用Hadoop折叠TB级的单词?,hadoop,mapreduce,Hadoop,Mapreduce,Hadoop是否有助于解决以下问题: 我需要根据一些规则将1000GB的单词折叠成一个单词。例如: fold("dog","cat") = "pet" 单词的折叠顺序并不重要。我想把所有的数据分成几个块,然后在每个块中先折叠单词。在那之后,折叠产生的单词 问题: 1) 使用Hadoop完成这项任务有意义吗 2) 要创建多少块,以及Hadoop有效工作的块大小应该是多少 谢谢 我想我现在明白你的问题了。为了简单起见,考虑一个例子,我们将简单地增加1000 GB的整数(正如你所说的加法可以大致等

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

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

 fold("dog","cat") = "pet"
单词的折叠顺序并不重要。我想把所有的数据分成几个块,然后在每个块中先折叠单词。在那之后,折叠产生的单词

问题:

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

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


谢谢

我想我现在明白你的问题了。为了简单起见,考虑一个例子,我们将简单地增加1000 GB的整数(正如你所说的加法可以大致等同于你的FULD()操作。 所以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));
     }
   }
公共类AddCombiner扩展了Reducer{
public void reduce(SomeKey键、Iterable值、上下文上下文)抛出IOException、InterruptedException
{
int-total=0;
for(可写入值:值)
{
total+=value.get();
}
write(key,newintwriteable(total));
}
}

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

听起来hadoop会有所帮助,因为这看起来像是对大量数据的批处理操作,但是fold()有什么作用呢你到底是怎么做的?你有定义吗?您是否有一个文件/列表显示“dog”->“pet”,“cat”->“pet”,“snake”->“wild”?我在字符集上定义了“+”操作。例如“d”+“c”=“p”等等。感谢您的详细解释。仍然存在的问题是:如何在HDF中分割1000GB的字,以减少节点之间的计算和传输数量?应该是一个文件还是多个小文件?你从哪里获取数据?它已经存在于文件中了吗?到目前为止,我只有4个大文件。不知道如何将它们放入Hadoop中。将它们放入HDFS只是执行“Hadoop fs-put”的问题。至于分割它们的最佳方式,我不确定。这很可能是一个试探性的举措。不过,对于初学者来说,您可以将这4个文件添加到HDFS中,正如我上面所说的。还有一些配置,如mapred.max.split.size,可用于创建更多/更少的拆分