2013-02-06 118 views
1

我試圖用三個步驟來實現一個mapreduce作業,並且在每一步之後我都需要到目前爲止所有步驟中的數據。有沒有人有關於如何將映射器或縮減器的結果保存到mrjob中的磁盤的示例/想法?MapReduce:Mrjob保存結果持續

回答

1

您可以將多個輸入傳遞給作業,只需將前一個作業的輸出作爲輸入。

當你說你想將結果保存到磁盤時,聽起來好像你依靠輸出流回到stdout?這種行爲只是一種方便(可以關閉),MRJob一切都會從磁盤上彈出。

對於一個兩個階段的工作,你可以這樣做:

job1 = firstMR(['-r', mode, inputDir, '-o', outputDir, '--no-output']) 
job1.set_up_logging() 
with job1.make_runner() as runner1: 
    runner1.run() 
    firstOutput = runner1.get_output_dir() 

job2 = secondMR(['-r', mode, firstOutput, anyOtherInput, '-o', finalOutputDir, '--no-output']) 
job2.set_up_logging() 
with job2.make_runner() as runner2: 
    runner2.run() 

出頭注意:

  • Hadoop上運行,所有目錄的也許應該是HDFS://一些/路徑/
  • MapReduce的任何參數不是標誌,並且沒有前面的選項被認爲是輸入文件或目錄
  • 使用--no-output停止輸出comi回到標準輸出(我在上面的第一步中使用了它,你可能不需要中間結果,但是在第二步中將其留在了第二步以證明不同)。在你需要三個步驟的情況下,你可以將它排除在前兩個,並在第三個。或者,將第三步的輸出寫入一個可以輕鬆回讀的文件夾。

讓我知道如果你碰到任何障礙,它應該是相對簡單的。

+0

如果你使用'with job1.make_runner()作爲runner1:'那麼離開'with'作用域後'firstOutput'目錄不能被清理?工作2不應該在job1'with'聲明的範圍之內嗎? 參考:https://pythonhosted.org/mrjob/runners-runner.html#mrjob.runner.MRJobRunner.cleanup – Andy