如何在Hadoop Reducer中创建新的、唯一的密钥

如何在Hadoop Reducer中创建新的、唯一的密钥,hadoop,mapreduce,Hadoop,Mapreduce,在Hadoop Reducer中,我希望在特定条件下创建并发出新键,并且我希望确保这些键是唯一的 我想要的伪代码如下所示: @Override protected void reduce(WritableComparable key, Iterable<Writable> values, Context context) throws IOException, InterruptedException { // do stuf

在Hadoop Reducer中,我希望在特定条件下创建并发出新键,并且我希望确保这些键是唯一的

我想要的伪代码如下所示:

@Override
protected void reduce(WritableComparable key, Iterable<Writable> values, Context context) 
                       throws IOException, InterruptedException {
     // do stuff:
     // ...
     // write original key:
     context.write(key, data);
     // write extra key:
     if (someConditionIsMet) {
       WritableComparable extraKey = createNewKey()
       context.write(extraKey, moreData);
     }
}
@覆盖
受保护的void reduce(可写可比键、可写值、上下文)
抛出IOException、InterruptedException{
//做事:
// ...
//写入原始密钥:
编写(键、数据);
//写入额外密钥:
if(someConditionIsMet){
WritableComparable extraKey=createNewKey()
write(extraKey,moreData);
}
}
所以我现在有两个问题:

  • 在reduce()中是否可能发出多个不同的键?我知道不会再使用钥匙了,但这对我来说没关系
  • 额外的密钥必须在所有的reducer中都是唯一的——这既是出于应用的原因,也是因为我认为它会违反reduce阶段的约定。 生成在减速器(可能在作业之间)中唯一的密钥的好方法是什么

    也许可以获取reducer/job ID并将其合并到密钥生成中

  • 是的,您可以输出任意数量的键
  • 您可以将任务尝试信息合并到您的密钥中,以使其成为唯一的作业(跨缩减器,如果您愿意,甚至可以处理推测性执行)。您可以从reducer的
    Context.gettaskattentid()
    方法获取此信息,然后使用
    TaskAttemptID.getTaskID().getId()提取reducer ID号