在 mapreduce 中,reducer 如何找到要拉取 map 输出的哪个分区
In mapreduce how reducer finds which partition of map output to pull
在 map-reduce 中,map 处理后生成分区输出。之后,reducer 从不同的映射器中提取特定的分区数据。在这里,reducer 如何知道它必须从 mapper 的输出中提取数据的哪个分区?
由分区机制决定。默认的分区机制是 Hash Partitioning。但是你可以为此定义一个自定义的分区器。
自定义分区程序的示例:-
public class Custom_Partitioner extends Partitioner<Text, IntWritable> {
@Override
public int getPartition(Text key, IntWritable value, int numPartitions) {
String myKey = key.toString().toLowerCase();
if (myKey.startsWith("a")) {
return 0;
} else if (myKey.startsWith("e")) {
return 1;
} else {
return 2;
}
}
}
并且在驱动程序代码中:-
job.setPartitionerClass(Custom_Partitioner.class);
job.setNumReduceTasks(3);
所以在这里,我们将reducer任务的数量设置为3,并根据不言自明的方式对partitioner进行编码。
谢谢!
在 map-reduce 中,map 处理后生成分区输出。之后,reducer 从不同的映射器中提取特定的分区数据。在这里,reducer 如何知道它必须从 mapper 的输出中提取数据的哪个分区?
由分区机制决定。默认的分区机制是 Hash Partitioning。但是你可以为此定义一个自定义的分区器。
自定义分区程序的示例:-
public class Custom_Partitioner extends Partitioner<Text, IntWritable> {
@Override
public int getPartition(Text key, IntWritable value, int numPartitions) {
String myKey = key.toString().toLowerCase();
if (myKey.startsWith("a")) {
return 0;
} else if (myKey.startsWith("e")) {
return 1;
} else {
return 2;
}
}
}
并且在驱动程序代码中:-
job.setPartitionerClass(Custom_Partitioner.class);
job.setNumReduceTasks(3);
所以在这里,我们将reducer任务的数量设置为3,并根据不言自明的方式对partitioner进行编码。 谢谢!