在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);
}
}
所以我现在有两个问题:
额外的密钥必须在所有Reducer中都是唯一的 - 这既是出于应用原因,也是因为我认为它会违反reduce阶段的合同。 生成一个在Reducer(以及可能跨作业)中唯一的密钥的好方法是什么?
可能获得reducer / job ID并将其合并到密钥生成中?
答案 0 :(得分:2)
Context.getTaskAttemptID()
方法获取此信息,然后使用TaskAttemptID.getTaskID().getId()