2012-11-20 83 views
1

我有一個在AWS EMR上運行的現有映射縮減作業,該作業處理數十億行日誌,並進行一些計算以從映射器形成(鍵,值)對。這些計算非常耗時,並且我需要在某些其他地圖縮減作業中使用這些計算的某些中間步驟的輸出。因此,我想要挖掘計算的輸出並上傳到s3,而不會影響現有的作業(即不更改當前的映射器或縮減器)。在上傳之前,我會先將這些行集中在一個本地臨時文件中,一旦文件變得足夠大,我將把這個文件上傳到s3。將文件從AWS EMR集羣中的映射器上傳到S3

問題是 - 與reducer不同,Mapper無法基於密鑰對數據進行排序。我如何爲s3設計獨特的文件名來上傳來自不同映射器的數據,這樣就不會有文件名衝突?

我正在使用Java。如果有辦法獲得映射器羣集ID或生成隨機數,也可以解決問題。對於所有映射器都是唯一的(我不知道該怎麼辦?)

回答

0

您可以獲取當前運行的Hadoop任務的任務嘗試ID,這在所有映射器中都是唯一的,因此可以用作文件名。下面的方法會給你嘗試id:

public static String getAttemptId(Configuration conf) throws IllegalArgumentException 
    { 
     if (conf == null) { 
      throw new NullPointerException("conf is null"); 
     } 

     String taskId = conf.get("mapred.task.id"); 
     if (taskId == null) { 
      throw new IllegalArgumentException("Configutaion does not contain the property mapred.task.id"); 
     } 

     String[] parts = taskId.split("_"); 
     if (parts.length != 6 || 
       !parts[0].equals("attempt") || 
       (!"m".equals(parts[3]) && !"r".equals(parts[3]))) { 
      throw new IllegalArgumentException("TaskAttemptId string : " + taskId + " is not properly formed"); 
     } 

     return parts[4] + "-" + parts[5]; 
    }