如何在Hadoop Reducer中创建新的唯一键

时间:2013-03-14 18:51:25

标签: hadoop mapreduce

在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);
     }
}

所以我现在有两个问题:

  1. 是否有可能在reduce()中发出多个不同的键?我知道不会使用钥匙,但这对我来说没问题。
  2. 额外的密钥必须在所有Reducer中都是唯一的 - 这既是出于应用原因,也是因为我认为它会违反reduce阶段的合同。 生成一个在Reducer(以及可能跨作业)中唯一的密钥的好方法是什么?

    可能获得reducer / job ID并将其合并到密钥生成中?

1 个答案:

答案 0 :(得分:2)

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