hadoop - MapReduce - 如何计算相对值(平均值、前 k 等)?

标签 hadoop mapreduce average

我正在寻找一种在 MapReduce 过程中计算“全局”或“相对”值的方法 - 平均值、总和、最高等。假设我有一个 worker 列表,他们的 ID 与他们的薪水相关联(并且一堆其他的东西)。在处理的某个阶段,我想知道谁是收入最高 10% 的 worker 。为此,我需要一些我无法理解的“全局”值(value)观。

如果我将所有值都发送到一个单一的 reducer 中,它具有全局 View ,但是我失去了并发性,这看起来很尴尬。有没有更好的办法?

(我想使用的框架是 Google 的,但我正在尝试找出技术 - 请不要使用特定于框架的技巧)

最佳答案

我的第一个想法是做这样的事情:

MAP:使用一些虚拟值作为键,可能是空字符串以提高效率,并创建包含薪水和员工 ID 的类。在每个 Mapper 中,创建一个包含 10 个元素的数组。用你看到的前十个薪水填充它,排序(所以位置 0 是最高的薪水,位置 9 是第 10 个最高的)。对于此后的每个工资,查看它是否在前十名中,如果是,则将其插入正确的位置,然后适本地将较低的工资向下移动。

Combiner/Reducer:合并排序列表。我基本上会通过创建一个十元素数组来做与映射器中相同的事情,然后循环遍历与键匹配的所有数组,根据与映射器中相同的比较/替换/下移顺序合并它们

如果你用一个 reducer 运行它,它应该确保输出前 10 名的薪水。

我没有看到在使用多个 reducer 时执行此操作的方法。如果您使用组合器,那么缩减器应该只需要为运行映射器的每个节点合并一个十元素数组(这应该是可管理的,除非您在数千个节点上运行)。

关于hadoop - MapReduce - 如何计算相对值(平均值、前 k 等)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5050781/

相关文章:

java - 在Ubuntu 16.04中使用JAVA中的MapReduce在文本文件中搜索给定单词

mongodb - 如何在 MongoDB 中按时间间隔聚合文档?

c# - 找出一组属性之间最相似的(mongodb)

java - 解析整数后计算平均值

mysql - 使用 MYSql 计算总和和平均百分比

hadoop映射器过度消耗内存(堆)

hadoop - 无法在终端中启动 Hive

linux - 入侵 whoami 以返回假用户名

C、如何调用一个函数

hadoop - WebHdfsFileSystem本地ip与网络ip hadoop