Hadoop从另一个文件中的一个文件中搜索单词

Boo*_*ean 2 hadoop mapreduce

我想构建一个hadoop应用程序,它可以读取一个文件中的单词并在另一个文件中搜索.

如果单词存在 - 它必须写入一个输出文件如果该单词不存在 - 它必须写入另一个输出文件

我在hadoop中尝试了几个例子.我有两个问题

两个文件各约200MB.检查另一个文件中的每个单词可能会导致内存不足.有没有其他方法可以做到这一点?

如何将数据写入不同的文件,因为hadoop的reduce阶段的输出只写入一个文件.是否可以使用过滤器来减少相位以将数据写入不同的输出文件?

谢谢.

Leo*_*das 8

我该怎么做:

  1. 通过单词"map"分割值,发出(<word>,<source>)(*1)
  2. 你会进入'减少':( <word>,<list of sources>)
  3. 检查源列表(对于两个/所有源可能很长)
  4. 如果并非所有源都在列表中,则每次都发出(<missingsource>,<word>)
  5. job2:job.setNumReduceTasks(<numberofsources>)
  6. job2:在'map'中发出(<missingsource>,<word>)
  7. job2:为'reduce'中的每个<missingsource>发出all(null,<word>)

你最终会得到与不同<missingsources>一样多的reduce-outputs,每个都包含文档中缺少的单词.您可以在'reduce'开头写出<missingsource> ONCE来标记文件.

(*1)如何找到地图中的来源(0.20):

private String localname;
private Text outkey = new Text();   
private Text outvalue = new Text();
...
public void setup(Context context) throws InterruptedException, IOException {
    super.setup(context);

    localname = ((FileSplit)context.getInputSplit()).getPath().toString();
}

public void map(Object key, Text value, Context context)
    throws IOException, InterruptedException {
...
    outkey.set(...);
    outvalue.set(localname);
    context.write(outkey, outvalue);
}
Run Code Online (Sandbox Code Playgroud)