2013-07-28 45 views
4

我已經編寫了一個mapreduce程序來處理日誌。作業除了將實際輸出寫入驅動程序代碼中設置的輸出路徑外部的其他位置外,還將邊數據寫入。但是,執行啓用,殺死任務嘗試的輸出不會被刪除。是否有辦法避免這個問題? 是否可以解決問題,而不是寫入正常輸出位置並在作業完成後複製到外部位置?使用Hadoop多輸出寫入多個輸出啓用推測執行

使用'OutputCommitter'可以解決這個問題嗎?

有沒有人試過嗎?任何幫助,將不勝感激。

回答

1

是的,可以使用FileOutputCommitter在任務成功時將臨時任務目錄的內容移動到最終輸出目錄,並刪除原始任務目錄。

我相信Hadoop中擴展FileOutputFormat的大多數內置輸出格式都使用OutputCommitter,默認情況下它是FileOutputCommitter。

這是FileOutputFormat

public synchronized 
    OutputCommitter getOutputCommitter(TaskAttemptContext context 
             ) throws IOException { 
    if (committer == null) { 
     Path output = getOutputPath(context); 
     committer = new FileOutputCommitter(output, context); 
    } 
    return committer; 
    } 

代碼寫入多個路徑,你也許可以考慮MultipleOutputs,在默認情況下使用OutputCommitter。

或者你可以創建自己的輸出格式和擴展FileOutputFomat和覆蓋上述功能在FileOutputFormat,創建自己的OutputCommitter實現看FileOutputCommitter代碼。

在FileOoutputcommitter代碼,你會發現的功能,你可能會感興趣的 - 如果一個任務,然後成功commitTask()被調用,它在默認 實現移動temporaray

/** 
    * Delete the work directory 
    */ 
    @Override 
    public void abortTask(TaskAttemptContext context) { 
    try { 
     if (workPath != null) { 
     context.progress(); 
     outputFileSystem.delete(workPath, true); 
     } 
    } catch (IOException ie) { 
     LOG.warn("Error discarding output" + StringUtils.stringifyException(ie)); 
    } 
    } 

任務輸出目錄(其名稱中包含 任務嘗試ID以避免任務 嘗試之間的衝突)到最終輸出路徑$ {mapred.out put.dir}。否則, 框架調用abortTask(),它將刪除臨時任務 的輸出目錄。

+1

,我會嘗試一下OutpurCommitter.I有一個查詢。如果我需要在mapreduce作業中輸出數據並減少任務,多個輸出如何工作(鍵和值類型對於多個輸出和正常輸出)?如果我在地圖任務中使用多個輸出來輸出數據,它會被寫入地圖任務本身還是會縮小以減少任務?鍵和值類型是否需要是通用的(即WritableComparable和Writable)? – InfamousCoconut

+0

它可以雙向使用 - 如果您使用mapper中的mos.write(K key,V value,String baseOutputPath),其中baseOutputPath與path/keyname類似,您將獲得路徑/ keyname-m-0000x的輸出。該輸出不會被減少任務處理。 Reduce任務只會處理使用context.write()發出的密鑰。您可以使用LazyOutputFormat模仿MultipleOutputFormat的行爲,如MultipleOutputs的同一鏈接中所述。而且,是的,隨着API的提及,MultipleOutputs中使用的鍵值必須是WritableComparable/Writable。 –

+0

。如果多輸出位置設置爲作業輸出位置,我已經閱讀了多個輸出的問題。假設我在使用與作業輸出相同位置的mapper和reducer中編寫多個輸出,它將如何表現?我會錯過寫入mapper階段的數據嗎? – InfamousCoconut

0

爲了避免_logs和_SUCCESS文件映射精簡輸出文件夾中創建您可能會使用以下設置:
conf.setBoolean( 「mapreduce.fileoutputcommitter.marksuccessfuljobs」,假); conf.set(「hadoop.job.history.user.location」,「none」);