将文件从 AWS EMR 集群中的映射器上传到 S3

Posted

技术标签:

【中文标题】将文件从 AWS EMR 集群中的映射器上传到 S3【英文标题】:Uploading files from mapper in AWS EMR cluster to S3 【发布时间】:2012-11-20 06:21:47 【问题描述】:

我有一个在 AWS EMR 上运行的现有 map reduce 作业,它处理数十亿行日志并进行一些计算以从 mapper 形成(键、值)对。这些计算非常耗时,我需要在其他一些 map reduce 作业中使用这些计算的一些中间步骤的输出。所以,我想利用计算的输出并上传到 s3,而不影响现有的工作(即不改变当前的映射器或减速器)。在上传之前,我会先将这些行收集到一个本地临时文件中,一旦文件变得足够大,我会将这个文件上传到 s3。

问题是 - 与 reducer 不同,Mapper 不能根据键对数据进行排序。如何为 s3 设计唯一的文件名以从不同的映射器上传数据,以免出现任何文件名冲突?

我正在使用 Java。如果有办法获取映射器集群 ID 或生成随机编号,也可以解决问题。所有映射器独有(我不知道该怎么做?)

【问题讨论】:

【参考方案1】:

您可以获得当前运行的 Hadoop 任务的任务尝试 ID,该 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];
   

【讨论】:

以上是关于将文件从 AWS EMR 集群中的映射器上传到 S3的主要内容,如果未能解决你的问题,请参考以下文章

Amazon EMR:为每个 EMR 实例设置唯一数量的映射器和缩减器

结合 AWS EMR 输出

根据映射器代码中的某些逻辑,将映射器中的一些数据(行)写入单独的目录

从文件中为hadoop中的映射器创建自定义键值

打开/关闭 AWS EMR 集群

如何将 Spark EMR 集群与 AWS elasticsearch 集群连接起来