是否可以以地图缩减方式计算一组数据的百分位数



我的理解是计算百分位数,数据需要排序。 如果大量数据分布在多个服务器上,而不移动它,这是否可行?

虽然MapReduce作为一种范式看起来不适合这个问题,但Hadoop对MR的实现却是。
Hadoop的mapreduce实现是基于分布式排序的 - 这正是你所需要的。Hadoop通过在服务器之间移动数据一次来进行排序 - 还不错。
我建议看看Hadoop terasort实现,它说明了使用hadoop对大量数据进行排序的好方法(可能是最好的)。http://hadoop.apache.org/docs/current/api/org/apache/hadoop/examples/terasort/package-summary.html

我会首先在一台机器或多台机器上创建一个直方图。 获得可能值的存储桶的每个可能值的计数后,您可以根据需要组合这些值。使用直方图的收益是它具有 O(1) 插入/排序时间而不是 O(log n),并使用 O(M) 空间,其中 M 是可能值或桶的数量,而不是 O(N),其中 N 是样本的数量。

直方图自然排序,因此您可以通过从两端计数来获得总数并找到百分位数。

您的问题的答案是肯定的,这是可能的。 但是Map-Reduce并不是真正为这种任务而设计的。 Map-Reduce(例如在Hadoop集群中使用)在非结构化或半结构化数据上大放异彩。 虽然它有能力处理其他种类,但它并不是最适合它。 (我在一家公司有一个项目,他们想在Hadoop集群中分析XML...这不是最有趣的事情。

这篇学术文章描述了Map-Reduce在结构化数据上的一些问题,并提供了"Clydesdale"的替代方法。 (我从未听说过或使用过它,所以我既不能认可它,也不能谈论它的优点/缺点。

我正在寻找更多提供解释和替代方案的链接。

最新更新