2010-06-17 78 views
3

我需要在兩個作業中拆分我的Map Reduce jar文件,以獲得兩個不同的輸出文件,一個來自兩個作業的每個reducer。Map Reduce:ChainMapper和ChainReducer

我的意思是第一份工作必須產生一個輸出文件,該文件將成爲鏈中第二份工作的輸入。

我讀了一些關於ChainMapper和ChainReducer的hadoop版本0.20(目前我使用的是0.18):這些可以滿足我的需求嗎?

任何人都可以建議我一些鏈接在哪裏找到一些例子,以使用這些方法?或者也許有另一種方法來實現我的問題?

謝謝

盧卡

回答

10

有很多方法可以做到這一點。

  1. 級聯工作

    創建的第一個作業的JobConf對象「JOB1」,並設置所有「輸入」作爲inputdirectory和「溫度」的輸出目錄參數。執行此工作:JobClient.run(job1)

    緊接着它,爲第二個作業創建JobConf對象「job2」,並將所有參數設置爲「temp」作爲inputdirectory和「output」作爲輸出目錄。執行此工作:JobClient.run(job2)

  2. 兩個JobConf對象

    創建兩個JobConf對象和設置在他們所有的參數一樣(1),除了不使用JobClient.run。

    然後創建兩個工作與jobconfs對象作爲參數:

    Job job1=new Job(jobconf1); Job job2=new Job(jobconf2);

    使用JobControl作業控制對象時,你指定作業依賴關係,然後運行的作業:

    JobControl jbcntrl=new JobControl("jbcntrl"); 
    jbcntrl.addJob(job1); 
    jbcntrl.addJob(job2); 
    job2.addDependingJob(job1); 
    jbcntrl.run(); 
    
  3. ChainMapper和ChainReducer

    如果您需要一個像Map + |減少| Map *,您可以使用Hadoop版本0.19及之後的ChainMapper和ChainReducer類。請注意,在這種情況下,只能使用一個縮減器,但在其之前或之後只能使用任意數量的映射器。

0

我認爲上述解決方案涉及磁盤I/O操作,因此會減慢大型數據集。另一種方法是使用Oozie或Cascading。