假设我有一个矩阵乘法代码。我希望它能使每个节点的映射器输出由一个reducer获取,即。一个完整的映射器输出文件的密钥将是相同的,这将与另一个节点的密钥不同。例如。如果一个Mapper文件用键1输出键/值对,则另一个Mapper将输出键/值对作为键2,依此类推。 我知道也许这个例子不能这样做,但如果我可以输出密钥作为某个特定的datanode ID或什么?同样,输出中的键可以是给定datanode的一些partciluar ID。有没有办法做到这一点?
基本上我希望一个映射器的所有输出以某种方式进入一个reducer,这可以通过给它们所有一个键来实现,而且我还想要一些并行性以便映射器输出分布通过集群,所以我希望每个密钥都是唯一的。 如果输入没有像那样组织,如何将此一个键分配给某些数据?
(请指出是否需要其他信息。感谢您的帮助)
答案 0 :(得分:0)
如果您想确保一个映射器的所有输出都在同一个reduce实例中结束,那么您可以使用map任务ID作为输出键:
public class MyMapper extends Mapper<LongWritable, Text, IntWritable, Text> {
private IntWritable mapId;
@Override
protected void setup(Context context) throws IOException,
InterruptedException {
mapId = new IntWritable(context.getTaskAttemptID().getTaskID().getId());
}
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
// ...
context.write(mapId, value);
}
}