是否可以将属性从映射器传递到hadoop中的reducer?

时间:2015-01-14 21:31:36

标签: hadoop mapreduce hdfs

我在地图中有一个值,我需要它是减少的第一个值。我可以在hdfs中保存这个值,然后我在setup()中读取它吗? 是否可以在reduce()中的setup()中从hdfs读取文件?

1 个答案:

答案 0 :(得分:0)

有多种方法可以做到这一点:

  1. 使用“特殊”键下的标准键/值输出向每个减速器发送值,以保证您的值首先到达减速器。 (您可能需要设置自定义排序比较器和分区程序)
  2. 使用映射器中的MultipleOutputsFileSystem来读取reducer设置中的文本文件。我想你也可以在mapper中使用FileSystem来编写。这不是最佳解决方案,需要注意时间,以确保在写入和关闭文件之前读取数据。
  3. 使用DistributedCache 编辑:实际上,我认为在同一作业中mapper和reducer之间不会起作用。请忽略此选项。
  4. 对于选项#1,假设您有一个Text键和Text值从mapper传递给reducer。 而且你知道你的密钥都不能以空格“”开头。所以你可以做的是构造一个特殊的键“”+#,其中#是一个reducer分区id(从0到N-1,其中N是你的reducer的总数)。然后在循环中写入输出键“01”,“02”,“03”,...以及您需要传递给每个reducer的值。 设置自定义partitioner,以便它识别“特殊”键并路由到相应的分区:

    int getPartition(Text key, Text value, int numPartitions) {
        if (key.toString().startWith(" ") {
            //special key
            int partId = Integer.parseInt(key.toString().substring(1));
            return partId;
        } else {
            //regular key
            return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
        }
    }
    

    显然,如果你有其他数据类型用于密钥,你仍然可以创造性地提出类似的逻辑。