使用MapReduce/Hadoop对大数据进行排序

2022-09-01 07:38:36

我正在阅读有关MapReduce的信息,以下事情使我感到困惑。

假设我们有一个包含100万个条目(整数)的文件,并且我们想使用MapReduce对它们进行排序。我理解的方式如下:

编写一个对整数进行排序的映射器函数。因此,框架会将输入文件划分为多个块,并将它们提供给不同的映射器。每个映射器将彼此独立地对其数据块进行排序。完成所有映射器后,我们将把它们的每个结果传递给 Reducer,它将合并结果并给我最终的输出。

我的疑问是,如果我们有一个化简器,那么它如何利用分布式框架,如果最终我们必须将结果合并到一个地方?问题深入到在一个地方合并100万个条目。是这样还是我错过了什么?

谢谢,钱德


答案 1

查看合并排序。

事实证明,对部分排序的列表在操作和内存消耗方面比对完整列表进行排序要有效得多。

如果化简器获得4个排序列表,它只需要查找4个列表中的最小元素并选择该元素。如果列表数恒定,则此递减是 O(N) 运算。

此外,通常化简器也“分布”在树之类的东西中,因此工作也可以被比喻。


答案 2

正如其他人所提到的,合并比排序简单得多,所以有一个很大的胜利。

但是,对巨型数据集执行 O(N) 串行操作也可能令人望而却步。正如您正确指出的那样,最好也找到一种并行进行合并的方法。

一种方法是将分区函数从随机分区器(这是通常使用的)替换为更智能的功能。例如,Pig为此所做的就是对数据集进行采样,以得出值分布的粗略近似值,然后将值范围分配给不同的化简器。化简器 0 获取所有元素< 1000,化简器 1 获取所有元素>= 1000,< 5000,依此类推。然后,您可以并行执行合并,并且根据您知道每个化简器任务的数量对最终结果进行排序。


推荐