是否可以将属性从映射器传递到 hadoop 中的缩减器?
Is it possible to pass properties from a mapper to a reducer in hadoop?
我在 map 中有一个值,我需要它作为 reduce 中的第一个值。是否有可能我将这个值保存在 hdfs 中,然后在 reduce 中的 setup() 中读取它?
是否可以在 reduce 的 setup() 中从 hdfs 读取文件?
有多种方法可以做到这一点:
- 使用 "special" 键下的标准 key/value 输出将值发送到每个 reducer,这将保证您的值首先到达您的 reducer。 (您可能需要设置自定义排序比较器和分区器)
- 在mapper中也使用MultipleOutputs in the mapper and FileSystem to read text files in the reducer setup. I think you can use FileSystem来写。这不是最佳解决方案,需要注意时间安排以确保在写入和关闭文件之前读取数据。
- 使用DistributedCache 编辑: 实际上,我认为在同一个作业中映射器和缩减器之间不会起作用。请忽略此选项。
对于选项 #1,比方说,您有一个文本键和文本值要从映射器传递到缩减器。
而且您知道您的两个键都不能以 space " " 开头。所以你可以做的是构造一个特殊的键“”+#,其中#是一个 reducer 分区 id(从 0 到 N-1,其中 N 是你的 reducer 的总数)。然后在一个循环中将键“01”、“02”、“03”...写入到输出中,并将您的值传递给每个减速器。
设置自定义 partitioner 以便它识别 "special" 键并路由到相应的分区:
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;
}
}
显然,如果您有其他数据类型用于键,您仍然可以创造性地想出类似的逻辑。
我在 map 中有一个值,我需要它作为 reduce 中的第一个值。是否有可能我将这个值保存在 hdfs 中,然后在 reduce 中的 setup() 中读取它? 是否可以在 reduce 的 setup() 中从 hdfs 读取文件?
有多种方法可以做到这一点:
- 使用 "special" 键下的标准 key/value 输出将值发送到每个 reducer,这将保证您的值首先到达您的 reducer。 (您可能需要设置自定义排序比较器和分区器)
- 在mapper中也使用MultipleOutputs in the mapper and FileSystem to read text files in the reducer setup. I think you can use FileSystem来写。这不是最佳解决方案,需要注意时间安排以确保在写入和关闭文件之前读取数据。
- 使用DistributedCache 编辑: 实际上,我认为在同一个作业中映射器和缩减器之间不会起作用。请忽略此选项。
对于选项 #1,比方说,您有一个文本键和文本值要从映射器传递到缩减器。 而且您知道您的两个键都不能以 space " " 开头。所以你可以做的是构造一个特殊的键“”+#,其中#是一个 reducer 分区 id(从 0 到 N-1,其中 N 是你的 reducer 的总数)。然后在一个循环中将键“01”、“02”、“03”...写入到输出中,并将您的值传递给每个减速器。 设置自定义 partitioner 以便它识别 "special" 键并路由到相应的分区:
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;
}
}
显然,如果您有其他数据类型用于键,您仍然可以创造性地想出类似的逻辑。