我最近和一位为亚马逊工作的人交谈,他问我:如何使用编程语言对数TB的数据进行排序?
我是一个C++人,当然,我们谈到了合并排序,其中一种可能的技术是将数据拆分成更小的尺寸并对每个数据进行排序并最终合并它们.
但实际上,像亚马逊或eBay这样的公司会对数TB的数据进行排序吗?我知道,他们存储了大量的信息,但他们是否对它们进行排序?
简而言之,我的问题是:为什么他们不会将它们排在第一位,而不是分类数TB的数据?
但实际上,像亚马逊/易趣这样的公司是否有数TB的数据?我知道,他们存储了大量的信息,但排序他们???
是.上次我检查Google 每天处理 超过20 PB的数据.
为什么他们不会将它们排在第一位而不是排序数TB的数据,简而言之就是我的问题.
编辑:relet非常好; 你只需要保留索引并对其进行排序.您可以通过这种方式轻松高效地检索排序数据.您不必对整个数据集进行排序.
考虑来自服务器的日志数据,亚马逊必须拥有大量数据.日志数据通常在接收时存储,即根据时间排序.因此,如果您希望按产品排序,则需要对整个数据集进行排序.
另一个问题是,很多时候需要根据处理要求对数据进行排序,这可能是事先未知的.
例如:虽然不是太字节,但我最近使用合并排序对24 GB的Twitter关注者网络数据进行了排序.我使用的实现是Dan Lemire教授.
http://www.daniel-lemire.com/blog/archives/2010/04/06/external-memory-sorting-in-java-the-first-release/
数据按用户ID排序,每行包含userid,后跟跟随他的用户ID.但是在我的情况下,我想要关于谁跟随谁的数据.因此,我必须在每一行中再次使用第二个用户标识对其进行排序.
但是对于1 TB的排序,我会使用Hadoop进行 map-reduce .Sort是map函数后的默认步骤.因此,我会选择map属性为identity,NONE为reduce功能和设置流式传输作业.
Hadoop使用HDFS将数据存储在64 MB的大块中(此值可以更改).默认情况下,它会按块运行单个映射.在运行map函数之后,map的输出被排序,我想通过类似于merge sort的算法.
以下是身份映射器的链接:http: //hadoop.apache.org/common/docs/r0.16.4/api/org/apache/hadoop/mapred/lib/IdentityMapper.html
如果你想按照那个数据中的某个元素进行排序,那么我会将该元素作为XXX中的一个键,并将该行作为值作为地图的输出.
是的,某些公司每天至少会对这些数据进行排序.
谷歌有一个名为MapReduce的框架,它将工作(如合并排序)拆分到不同的盒子上,并顺利处理硬件和网络故障.
Hadoop是一个类似的Apache项目,您可以自己玩,以便在一组计算机上拆分排序算法.