mapreduce—在hadoop中是否可以将属性从Map器传递到还原器?

uhry853o  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(352)

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

dsf9zpds

dsf9zpds1#

有多种方法可以做到这一点:
使用“特殊”键下的标准键/值输出向每个减速机发出值,这将确保值首先到达减速机(您可能需要设置自定义排序比较器和分区器)
在Map器和文件系统中使用multipleoutputs读取reducer设置中的文本文件。我认为你也可以使用Map器中的文件系统来编写。这不是最佳解决方案,需要注意计时,以确保在写入和关闭文件之前读取数据。
使用distributedcacheedit:实际上,我不认为这将在同一个作业中的mapper和reducer之间起作用。请忽略此选项。
对于选项#1,假设您有一个文本键和文本值要从mapper传递到reducer。你知道你的钥匙都不能以空格开头。因此,您可以构造一个特殊键“”+#,其中#是一个reducer分区id(从0到n-1,其中n是reducer的总数)。然后在一个循环中写入输出键“01”、“02”、“03”。。。你的价值,你需要传递给每个减速机。设置自定义分区器,以便它识别“特殊”键并路由到相应的分区:

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;
    }
}

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

相关问题