我试图了解MapReduce模型,我需要建议,因为我不确定如何使用map函数的中间结果对文件进行排序和分区的方式。我从MapReduce papers of Jeffrey Dean & Sanjay Ghemawat和Hadoop:The Definitive Guide获得了关于MapReduce的最多知识。
具有map函数中间结果的文件是小型排序和分区文件的复合。这些小文件分为与reduce worker相对应的分区。然后将小文件合并到一个文件中。我需要知道如何完成小文件的分区。首先,我认为每个分区都有一定范围的密钥。
例如:如果我们在范围< 1; 100>范围内获得了整数键。并且文件被分成三个分区,然后第一个分区可以包括键在范围< 1,33>中的值,第二个分区具有范围< 34; 66>的键。和第三分区< 67; 100>。同样的分区也在合并文件中。
但我不确定。每个分区都发送给相应的reduce worker。在我们的示例中,如果我们有两个reduce worker,那么具有前两个键范围(< 1,33>和< 34; 66>)的分区可以被发送到第一个worker并且最后一个分区被发送到第三个worker。但是,如果我错了,并且文件以另一种方式划分(我的意思是分区没有自己的可能键范围),那么每个reduce工作者都可以获得相同键的结果。所以我需要以某种方式合并这些减少工人的结果,对吗?我可以将这些结果发送到主节点并将它们合并到那里吗?
简短版本:我需要解释地图阶段文件的划分方式(如果我的描述错误),并解释我如何以及在哪里处理减少工人的结果。
我希望我能够理解我的问题。当然,我可以解释得更多。
非常感谢您的回答。
答案 0 :(得分:0)
有一个Partitioner类可以做到这一点。中间文件中的每个键/值对与减速器(分区)的总数一起传递给分区器,分区器返回应该处理该特定键/值对的分区号。
有一个默认分区程序可以执行正常的分区工作,但是如果你想要更好的控制,或者你有一个特殊格式化的(例如复杂的)密钥,那么你可以而且应该编写自己的分区程序。