从aws emr集群中的mapper上传文件到s3

j0pj023g  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(388)

我在aws emr上运行了一个现有的map reduce作业,该作业处理数十亿行日志,并通过mapper进行一些计算以形成(键、值)对。这些计算非常耗时,我需要在其他一些map reduce作业中使用这些计算的中间步骤的输出。所以,我想在不影响现有作业的情况下(即不更改当前的Map器或缩减器),点击计算的输出并上传到s3。在上传之前,我将首先把这些行收集到一个本地临时文件中,一旦文件变得足够大,我将把这个文件上传到s3。
问题是-与reducer不同,mapper不能基于键对数据进行排序。如何为s3设计唯一的文件名,以便从不同的Map器上载数据,从而避免任何文件名冲突?
我在用java。这个问题也可以解决,若有一种方法来获得Map器集群id或生成随机编号。唯一的所有Map器(我不知道怎么做?)

n6lpvg4x

n6lpvg4x1#

您可以获取当前运行的hadoop任务的任务尝试id,该id在所有Map程序中都是唯一的,因此可以用作文件名。以下方法将获取尝试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];
   }

相关问题