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

Posted

技术标签:

【中文标题】使用 MapReduce/Hadoop 对大数据进行排序【英文标题】:Sorting large data using MapReduce/Hadoop 【发布时间】:2011-04-07 03:59:26 【问题描述】:

我正在阅读有关 MapReduce 的内容,但以下内容让我感到困惑。

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

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

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

谢谢, 钱德

【问题讨论】:

【参考方案1】:

查看合并排序。

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

如果 reducer 得到 4 个排序列表,它只需要查找 4 个列表中的最小元素并选择那个。如果列表的数量是恒定的,这种减少是一个 O(N) 操作。

通常,reducer 也“分布”在树之类的东西上,因此工作也可以并行化。

【讨论】:

当它从每个映射器获得第一个结果时,reducer 可以开始给出结果,允许(在合并排序的情况下)在给出输出的同时执行过程(合并),这是一个巨大的时间改进和记忆。 只有当你总是使用相同数量的映射器时它才会保持不变。一般来说,如果你使用最小堆,合并 N 个列表中的 M 个元素是 O(M log N),而“朴素”的方法是 O(M * N)。但是,是的,正如您所期望的 M >> N,它基本上是线性的。 还有一个实际的考虑是,在“短期”内,您的资源(即 CPU 内核和机箱)是恒定的,需要管理层批准才能增加 M。因此,M 看起来像阿兹特克金字塔,有几个“常量” ' 步骤。 映射器的数量(以及 N)不受可用内核的限制,而是受数据大小的限制——至少在 Hadoop 中是这样。如果您的任务多于地图槽,那么您最终会拥有多个“波”的映射器。【参考方案2】:

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

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

做到这一点的一种方法是将随机分区器(这是通常使用的)的分区功能替换为更智能的东西。例如,Pig 为此所做的就是对您的数据集进行采样以得出值分布的粗略近似值,然后将值范围分配给不同的 reducer。 Reducer 0 获取所有元素 = 1000 且

【讨论】:

【参考方案3】:

因此,使用 map-reduce 进行排序的最简单方法(虽然不是最有效的方法)是执行以下操作

在地图阶段 (Input_Key, Input_Value) 发出 (Input_Value,Input Key)

Reducer 是一个 Identity Reducer

例如,如果我们的数据是学生、年龄数据库,那么您的映射器输入将是 ('A', 1) ('B',2) ('C', 10) ... 输出将是 (1, A) (2, B) (10, C)

尚未尝试过此逻辑,但这是我正在处理的家庭作业问题中的一步。会放一个更新源代码/逻辑链接。

【讨论】:

这里放了源码和解释rorlig.wordpress.com/2011/04/17/sorting-data-with-mapreduce 如何验证?以及如何确保对发出的键进行排序?【参考方案4】:

很抱歉迟到了,但对于未来的读者,是的,钱德,你错过了一些东西。

逻辑是,Reducer 只能处理其运行的节点的混洗和排序数据。我的意思是在一个节点上运行的reducer 不能查看其他节点的数据,它只对它的数据应用reduce 算法。所以不能应用归并排序的归并过程。

因此,对于大数据,我们使用 TeraSort,它只不过是带有自定义分区器的身份映射器和缩减器。你可以在这里阅读更多关于它的信息Hadoop's implementation for TeraSort。它指出:

“TeraSort 是一个标准的 map/reduce 排序,除了一个自定义分区器,它使用 N - 1 个采样键的排序列表,定义每个 reduce 的键范围。特别是,所有键,例如 sample[i - 1 ]

【讨论】:

【参考方案5】:

我认为,组合多个排序项比组合多个未排序项更有效。因此,mapper 完成了对块进行排序的任务,reducer 将它们合并。如果映射器没有进行排序,reducer 将很难进行排序。

【讨论】:

【参考方案6】:

使用 MapReduce 可以有效地实现排序。但是您似乎正在考虑使用 mapreduce 实现合并排序以实现此目的。它可能不是理想的候选人。

就像您提到的那样,合并排序(使用 map-reduce)将涉及以下步骤:

    将元素分成小组,并以循环方式将每个组分配给映射器 每个映射器都会对子集进行排序并返回 K, subset,其中所有映射器的 K 相同 由于所有映射器都使用相同的 K,因此只有一个 reducer,因此只有一个 reducer。 reducer 可以合并数据并返回排序后的结果

这里的问题是,就像你提到的那样,在缩减阶段只能有一个缩减器来排除并行性。就像其他回复中提到的那样,可以考虑为此目的使用 mapreduce 特定的实现,例如 terasort。

在http://www.chinacloud.cn/upload/2014-01/14010410467139.pdf找到解释

回到归并排序,如果 hadoop(或等效)工具提供减速器层次结构,其中一级减速器的输出进入下一级减速器或将其循环回同一组减速器,这将是可行的

【讨论】:

以上是关于使用 MapReduce/Hadoop 对大数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章

大数据之Hadoop(MapReduce):Hadoop解决数据倾斜方法

E-MapReduce(Hadoop)10大类问题之集群规划

Hadoop权威指南(第四版)

大数据之Hadoop(MapReduce):Hadoop序列化

MapReduce

Hadoop必知必会一