0

只是为了学习,我尝试修改字数示例并添加了一个partiotiner。我理解通过编写自定义的partiotiner我们可以控制Reduce Task的数量从而被创建的部分。这很好。

但是我无法理解的一个问题是在 hdfs 中生成的输出文件的数量,这取决于所谓的 Reduce Task 的数量或为每个 Reduce 任务完成的 Reduce 调用的数量。(对于每个 Reduce 任务,可能会发生许多 reduce 调用)。

让我知道是否需要任何其他细节。代码非常基本,所以不要发布它。

4

1 回答 1

0

我认为您认为编写自定义分区程序可以控制创建的 Reduce Task 的数量是错误的。请检查以下说明:-

实际上,分区器根据键的哈希值确定在哪个减速器中发送键和值列表,如下所述。 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; } }

现在生成的输出文件数量的问题取决于您要求作业运行的减少任务的数量。因此,如果假设您为该作业配置了 3 个 reduce 任务,并假设您编写了一个自定义分区器,导致仅将密钥发送到 2 个 reducer。在这种情况下,您将找到第三个减速器的空 part-r00002 输出文件,因为它在分区后没有得到任何记录。可以使用 LazyOutputFormat 删除这个空的部分文件。

前任:import org.apache.hadoop.mapreduce.lib.output.LazyOutputFormat; LazyOutputFormat.setOutputFormatClass(job, TextOutputFormat.class);

我希望这能消除你的疑问。

于 2013-10-08T07:38:08.530 回答