2010-01-24 91 views
2

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

如果存在的话 - 它写入到一个输出文件 如果单词不存在 - 它有可能写入另一个输出文件

我试图在Hadoop中的几个例子。我有两个问题

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

如何将数据写入不同的文件,因为hadoop的reduce阶段的输出只写入一个文件。是否有可能有一个用于缩小阶段的过滤器来将数据写入不同的输出文件?

谢谢。

+0

嗨,我有implemet几乎为你做同样的事情,但我Hadoop的初学者,真的不设法使这:/请请你能看看我的问题,并给我一些反馈,我真的很挣扎,不能得到任何帮助:/ http://stackoverflow.com/questions/2986271/need-help-implementing-this-algorithm -with-map-hadoop-mapreduce – Julia 2010-06-12 16:26:52

回答

8

我怎么会做:在 '地图' 的话,发射(<字>,<源>)(* 1)

  • 你会得到 '减少'

    1. 分裂值(<字>,来源<列表>)
    2. 检查源列表(可能是长两个/所有来源)
    3. 如果不是全部的代码在列表中,发出每次(< missingsource>,< word>)
    4. JOB2:job.setNumReduceTasks(< numberofsources>)
    5. JOB2:发射在 '地图'(< missingsource>,<字>)
    6. JOB2:发射针对每个< missingsource>在 '减少' 所有(NULL, <字>)

    您将与结束了尽可能多的减少,输出作为不同< missingsources>,每个包含文档的丢失的话。您可以在'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); 
    } 
    
  • +0

    真棒..非常感谢你。 – Boolean 2010-01-26 02:06:41

    0

    你会想在两个阶段做到这一点,在我看来。针对这两个初始文档运行wordcount程序(包含在hadoop示例jar中),这将为您提供两个文件,每个文件包含每个文档中单词的唯一列表(包含计数)。从那里,而不是使用hadoop做两个文件,这应该回答你的问题简单的差异,

    1

    你是否使用Hadoop/MapReduce的特定原因来解决这个问题?这听起来像是比Hadoop更适合基于Lucene的应用程序。

    如果你必须使用Hadoop的,我有几个建议:

    1. 你的“文件”将需要在MapReduce的可以处理的格式。最简单的格式是基于CSV的文件,每行文档中的每个单词。有PDF等不起作用。

    2. 要拍摄一组单词输入到你MapReduce工作来比较的是,MapReduce的处理,你可以使用Distributed Cache,使每一个映射器构建一套要在输入查找单词的数据。但是,如果你的单词列表发现它很大(你提200MB),我怀疑这会工作。然而,这种方法是您可以在MapReduce中进行连接的主要方法之一。

    在另一个答案中提到的索引方法也提供了可能性。虽然如此,索引文档的术语让我觉得Lucene而不是hadoop。如果您确实使用了此方法,则需要确保键值包含文档标识符以及单词,以便每个文档中都包含单词计数。

    我不认为我曾经从一个MapReduce作业生成多个输出文件。你需要编写一些(并且这将是非常简单的)代码来将索引输出处理成多个文件。

    相关问题