繁体   English   中英

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

[英]Sorting using Map-Reduce - Possible approach

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

有两种可能的方法:

  1. 普通合并排序
  2. 在计算第59个变量时,我开始将特定范围内的变量发送到特定节点。 对这些节点中的范围进行排序,然后在我对数据进行了完美排序之后,将它们合并在reducer中,现在我也知道在哪里合并什么数据集; 它基本上变成附加的。

哪种方法更好,为什么呢?

我假设您正在寻找一个总排序顺序,而所有行都没有二级排序。 我还应该提到,“更好”永远不是一个好问题,因为通常会在时间和空间之间进行权衡,并且在Hadoop中,除非您使用针对时间进行了优化的产品,否则我们倾向于从空间而不是时间的角度进行思考(TeraData具有将数据库放入内存以供Hadoop使用的功能)

在您提到的两种可能的方法中,我认为在Hadoop基础架构中只有一种可行。 数字2,由于Hadoop利用许多节点来完成一项工作,因此排序变得有些棘手,并且由于分布式排序是编程模型的核心,所以我们通常希望MR的“随机排序”阶段来进行排序。

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

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

查看HadoopStreaming Wiki页面的Hadoop Comparator类部分

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM