0

假设我有一个矩阵乘法代码。我希望每个节点的映射器输出将由一个减速器获取,即。一个完整的映射器输出文件的密钥将相同,与另一个节点的密钥不同。例如。如果一个 Mapper 文件以键 1 输出键/值对,则另一个 Mapper 将键/值对输出为键 2,依此类推。我知道这个例子可能无法做到这一点,但是如果我可以将密钥输出为某个特定的数据节点 ID 或其他东西?如,输出中的键可能是给定数据节点的某些特定 ID。有没有办法做到这一点?

基本上我希望一个映射器的所有输出以某种方式进入一个减速器,这可以通过给它们一个 key来实现,而且我还想要一些并行性,以便映射器输出通过集群分布,所以我想要密钥每个都是独一无二的。如果输入不是这样组织的,如何将这一键分配给某些数据?

(如果需要更多信息,请指出。感谢您的帮助)

4

1 回答 1

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);
    }
}
于 2013-07-11T01:59:39.030 回答