2010-01-24 79 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作業生成多個輸出文件。你需要編寫一些(並且這將是非常簡單的)代碼來將索引輸出處理成多個文件。

    相關問題