2009-09-29 13 views

Répondre

11

Si vous avez besoin d'un identifiant unique pour un fichier d'effets secondaires dans Hadoop, vous pouvez tirer parti de la tentative id unique dans le travail avec ce code:

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]; 
    } 
4

fin à la partie, mais vous pouvez utiliser le TaskAttemptID classe pour analyser la propriété mapred.task.id.

Dans mon cas, je voulais la valeur numérique de tentative elle-même et utilisé ce qui suit dans mon Mapper:

int _attemptID; 

@Override 
public void configure(JobConf conf) { 
    TaskAttemptID attempt = TaskAttemptID.forName(conf.get("mapred.task.id")); 
    _attemptID = attempt.id(); 
} 
9

Avec la nouvelle API Hadoop:

context.getTaskAttemptID().getTaskID().getId() 
Questions connexes