我在AWS EMR上运行现有的map reduce作业,它处理数十亿行日志并进行一些计算以形成mapper中的(key,value)对。这些计算非常耗时,我需要在其他一些map reduce工作中使用这些计算的某些中间步骤的输出。所以,我想点击计算的输出并上传到s3,而不影响现有的作业(即不改变当前的映射器或缩减器)。在上传之前,我将首先在本地临时文件中收集这些行,一旦文件变得足够大,我将把这个文件上传到s3。
问题是 - 与reducer不同,Mapper不能基于密钥对数据进行排序。如何设计s3的唯一文件名以从不同的映射器上传数据,以便不会出现任何文件名冲突?
我正在使用Java。如果有办法获取映射器集群ID或生成随机数,也可以解决问题。所有映射器都是独一无二的(我不知道怎么办?)
答案 0 :(得分: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];
}