【问题标题】:Can I output key/value pairs such that one key is specific to one node in Hadoop MapReduce?我可以输出键/值对,这样一个键特定于 Hadoop MapReduce 中的一个节点吗?
【发布时间】:2013-07-11 09:59:39
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以设计自己的自定义分区器并确保正确的键进入正确的减速器。查看一些使用 mapreduce 进行二级排序的示例,了解自定义分区器的工作原理。
  • 问题是如何生成这些密钥。一个映射器的一个键,另一个依赖于映射器输出所在节点的另一个键?

标签: java hadoop mapreduce


【解决方案1】:

如果你想确保一个映射器的所有输出最终都在同一个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);
    }
}

【讨论】:

  • 是的,我想这非常接近我想要的!非常感谢!
猜你喜欢
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-29
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多