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