我正在阅读有关MapReduce的内容,以下内容令我感到困惑。
假设我们有一个包含100万个条目(整数)的文件,我们想要使用MapReduce对它们进行排序。我理解的方式如下:
编写一个对整数进行排序的映射器函数。因此框架会将输入文件分成多个块,并将它们分配给不同的映射器。每个映射器将彼此独立地对其数据块进行排序。完成所有映射器后,我们会将每个结果传递给Reducer,它会将结果合并到最终输出中。
我怀疑的是,如果我们有一个reducer,那么它如何利用分布式框架,如果最终我们必须将结果合并到一个地方?问题是在一个地方合并100万个条目。是这样还是我错过了什么?
谢谢, 钱德尔
答案 0 :(得分:23)
查看merge-sort。
事实证明,排序部分排序列表在操作和内存消耗方面比排序整个列表更有效。
如果reducer获得4个排序列表,则只需要查找4个列表中的最小元素并选择该列表。如果列表的数量是常数,则减少是O(N)操作。
通常减速器也会像树一样“分布”,所以工作也可以并行化。
答案 1 :(得分:13)
正如其他人所说,合并比排序简单得多,因此在那里取得了很大的胜利。
但是,对巨型数据集执行O(N)串行操作也是令人望而却步的。正如您正确指出的那样,最好还是找到一种并行进行合并的方法。
执行此操作的一种方法是将分区函数从随机分区程序(通常使用的分区程序)替换为更智能的程序。例如,Pig为此做的是对数据集进行采样,以得出值的分布的粗略近似值,然后将值的范围分配给不同的reducer。 Reducer 0获取所有元素< 1000,减速器1获得所有元素> = 1000并且< 5000,等等。然后,您可以并行执行合并,并根据您知道每个reducer任务的数量对最终结果进行排序。
答案 2 :(得分:7)
因此,使用map-reduce进行排序的最简单方法(尽管不是最有效的方法)是执行以下操作
在地图阶段 (Input_Key,Input_Value)发出(Input_Value,Input Key)
Reducer是Identity Reduceer
因此,例如,如果我们的数据是学生,年龄数据库,那么您的映射器输入就是 ('A',1)('B',2)('C',10)......输出结果为 (1,A)(2,B)(10,C)
没有尝试过这种逻辑,但这是我正在研究的家庭作业问题的一步。将放置更新源代码/逻辑链接。
答案 3 :(得分:2)
很抱歉迟到但是对于未来的读者,是的,Chander,你错过了什么。
逻辑是,Reducer只能处理其运行的节点的混乱和分类数据。我的意思是在一个节点上运行的reducer不能查看其他节点的数据,它只对其数据应用reduce算法。因此无法应用合并排序的合并过程。
因此,对于大数据,我们使用TeraSort,它只是身份映射器和带有自定义分区器的reducer。您可以在此处详细了解Hadoop's implementation for TeraSort。它声明:
“TeraSort是标准的map / reduce排序,除了自定义分区器使用N-1个采样键的排序列表,这些键定义了每个reduce的键范围。特别是,所有键都是样本[i - 1 ]< = key< sample [i]被发送以减少i。这保证了reduce i的输出都小于reduce i + 1的输出。“
答案 4 :(得分:1)
我认为,组合多个排序项比组合多个未排序项更有效。因此,映射器执行排序块的任务,并且reducer合并它们。如果映射器没有进行排序,则reducer将很难进行排序。
答案 5 :(得分:1)
使用MapReduce可以有效地实现排序。但是您似乎正在考虑使用mapreduce实现merge-sort来实现此目的。它可能不是理想的候选人。
就像你提到的那样,mergesort(使用map-reduce)将涉及以下步骤:
这里的问题是,就像你提到的那样,只有一个减速器可以在减速阶段排除并行性。就像在其他回复中提到的那样,可以考虑使用mapreduce特定的实现,例如terasort。
在http://www.chinacloud.cn/upload/2014-01/14010410467139.pdf
找到解释回到合并排序,如果hadoop(或等效)工具提供reducers的层次结构,其中一级reducer的输出进入下一级reducers或将其循环回同一组reducer,这将是可行的。