只是为了学习我试图修改单词计数示例并添加了一个partiotiner。我理解通过编写定制的partiotiner我们可以控制Reduce Task的数量以便创建的部分。这很好。
但是我无法理解的一个问题是在hdfs中生成的输出文件的数量,这取决于所谓的Reduce Task的数量或者为每个Reduce任务执行的Reduce调用的数量。 (对于每个Reduce Task,可能会发生许多reduce调用)。
如果需要任何其他详细信息,请与我们联系。代码非常基本,所以不发布。
答案 0 :(得分:0)
我认为您认为编写自定义分区程序可以控制创建Reduce Task的次数是错误的。请检查以下说明: -
实际上,paritioner根据密钥的哈希值确定在哪个reducer中发送密钥和值列表,如下所述。
public class HashPartitioner<K, V> extends Partitioner<K, V> {
public int getPartition(K key, V value,
int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}
现在生成的输出文件数量的问题取决于您要求作业运行的reduce任务的数量。因此,如果您为作业配置了3个reduce任务,并且说您编写了一个自定义分区程序,导致仅将密钥发送到2个reducer。在这种情况下,您将找到第三个reducer的空part-r00002输出文件,因为它在分区后没有得到任何记录。可以使用LazyOutputFormat删除此空零件文件。
例如:import org.apache.hadoop.mapreduce.lib.output.LazyOutputFormat;
LazyOutputFormat.setOutputFormatClass(job, TextOutputFormat.class);
我希望这可以解除你的怀疑。