0

我正在尝试理解 MapReduce 模型,我需要建议,因为我不确定如何使用 map 函数的中间结果对文件进行排序和分区。我从Jeffrey Dean 和 Sanjay Ghemawat 的 MapReduce 论文以及 Hadoop: The Definitive Guide 中获得了关于 MapReduce 的最多知识。

具有map函数中间结果的文件是小型排序和分区文件的组合。这些小文件被划分为对应于reduce worker的partition。然后将小文件合并为一个文件。我需要知道小文件的分区是如何完成的。首先,我认为每个分区都有一定范围的键。

例如:如果我们将键作为整数在 <1;100> 范围内,并且文件分为三个分区,那么第一个分区可以包含键在 <1,33> 范围内的值,第二个分区可以包含键在 <1,33> 范围内的值34;66> 和第三分区 <67;100>。合并文件中也有相同的分区。

但我不确定。每个分区都被发送到相应的reduce worker。在我们的示例中,如果我们有两个 reduce 工作人员,则可以将具有前两个键范围(<1,33> 和 <34;66>)的分区发送给第一个工作人员,将最后一个分区发送给第三个工作人员。但是,如果我错了并且文件以另一种方式划分(我的意思是分区没有自己的可能键范围),那么每个 reduce 工作人员都可以得到相同键的结果。所以我需要以某种方式合并这些减少工作者的结果,对吗?我可以将这些结果发送到主节点并在那里合并吗?

简而言之:我需要解释 map 阶段的文件是如何划分的(如果我的描述是错误的),并解释我如何以及在哪里可以处理 reduce 工作人员的结果。

我希望我描述了我的问题足以理解。当然,我可以解释更多。

非常感谢你的回答。

4

1 回答 1

0

有一个 Partitioner 类可以做到这一点。中间文件中的每个键/值对与归约器(分区)的总数一起传递给分区器,分区器返回应该处理该特定键/值对的分区号。

有一个默认的分区程序可以很好地完成分区工作,但是如果您想要更好的控制或者如果您有一个特殊格式化(例如复杂)的密钥,那么您可以并且应该编写自己的分区程序。

于 2012-10-08T18:25:05.677 回答