2

在 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(可能跨作业)唯一的密钥的好方法?

    也许获取减速器/作业 ID 并将其合并到密钥生成中?

4

1 回答 1

2
  1. 是的,您可以输出任意数量的键
  2. 您可以将任务尝试信息合并到您的密钥中,以使其作业唯一(跨减速器,甚至根据需要处理推测执行)。您可以从reducer的方法中获取此信息Context.getTaskAttemptID(),然后使用TaskAttemptID.getTaskID().getId()
于 2013-03-15T01:42:42.470 回答