使用Map-Reduce排序 - 可能的方法

时间:2013-06-04 19:19:29

标签: python sorting hadoop bigdata hadoop-streaming

我有一个包含5亿行和58个变量的大型数据集。我需要使用第59个变量中的一个对数据集进行排序,该变量是使用其他58个变量计算的。变量恰好是一个浮点数,在十进制之后有四个位置。

有两种可能的方法:

  1. 正常合并排序
  2. 在计算第59个变量时,我开始将特定范围的变量发送到特定节点。对这些节点中的范围进行排序,然后在我完全排序数据后将它们组合在reducer中,现在我也知道在哪里合并哪些数据集;它基本上会成为追加。
  3. 哪种方法更好?为什么?

2 个答案:

答案 0 :(得分:0)

我假设您正在查找所有行中没有辅助排序的总排序顺序。我还应该提到“更好”从来都不是一个好问题,因为通常需要在时间和空间之间进行权衡,而在Hadoop中我们倾向于考虑空间而不是时间,除非您使用针对时间优化的产品(TeraData)能够将数据库放入内存以供Hadoop使用)

在您提到的两种可能方法中,我认为只有一种方法可以在Hadoop基础架构中运行。 Num 2,由于Hadoop利用许多节点来执行一个作业,因此排序变得有点棘手,我们通常希望MR的“shuffle and sort”阶段负责排序,因为分布式排序是编程模型的核心。

在生成第59个变量时,您需要对该变量的分布进行采样,以便您可以通过框架发送它,然后像您提到的那样进行合并。考虑x的变量分布包含80%的值的情况。这可能会将80%的数据发送给一个能完成大部分工作的减速器。当然,这假定某些键将按照排序和随机播放阶段进行分组,除非您将它们编程为唯一的,否则就是这种情况。程序员可以通过对密钥分发进行抽样来设置分区器以均匀分配负载。

另一方面,如果我们要在内存中排序,那么我们可以在reduce期间完成同样的事情,但是存在固有的可伸缩性问题,因为排序仅与当前运行排序的节点中可用的内存量一样好当它开始使用HDFS查找不适合内存的其余数据时,它会很快消失。如果您忽略了采样问题,除非所有键值对均匀分布并且您了解数据中的内存容量,否则可能会耗尽内存。

答案 1 :(得分:0)

查看HadoopStreaming Wiki Page

的Hadoop Comparator类部分

您可以将数据集移动到HDFS,使用Python编写映射器并执行hadoop流式映射器作业。 Hadoop Streaming会自动帮助您对它们进行排序。

然后,如果需要,可以使用hdfs dfs -getmerge和-copyToLocal将已排序的记录移回本地。