2012-11-20 45 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]; 
    }