根据reduce任务或reduce方法调用,在HDFS中减少输出文件的数量



只是为了学习,我试图修改字数统计示例并添加了一个参与者。我理解了通过编写自定义参与者我们可以控制减少任务的数量的部分,从而创建。这很好。

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

如果需要任何其他细节,请告诉我。代码是非常基本的,所以不发布它。

我认为

您认为编写自定义分区程序可以控制创建的减少任务数量的看法是错误的。请检查以下说明:-

实际上,paritioner根据密钥的哈希值确定在哪个化简器中发送密钥和值列表,如下所述。 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 个化简器中。在这种情况下,您将找到第三个化简器的空 part-r00002 输出文件,因为它在分区后没有获得任何记录。这个空的零件文件可以使用LazyOutputFormat删除。

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

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

相关内容

  • 没有找到相关文章

最新更新