如何在大型数据集中查找全局平均值?

时间:2015-07-23 04:26:29

标签: hadoop mapreduce bigdata

我正在编写简单的mapreduce程序来查找我的数据中存在的平均数,最小数和最大数(许多文本文件)。我猜想使用组合器在单个映射器处理的数字中找到所需的东西提高效率。

然而,我担心的是,为了能够找到平均数,最小数或最大数,我们需要所有映射器(以及所有组合器)的数据转到单个减速器,以便我们可以找到通用平均数,最小数或最大数。如果数据集较大则会成为一个巨大的瓶颈。

我相信在hadoop中有一些方法可以解决这个我可能无法想到的问题。有人可以指导我。我在几次采访中也被问过这类问题。

同时在运行我的'Find Average'mapreduce程序时,我遇到了一个问题,唯一正在运行的映射器需要很长时间才能完成。我已经增加了map任务超时但它仍然卡住了。所以stdout日志的帮助我发现我的mapper和combiner执行得很顺利。因此我无法弄清楚导致我的mapreduce作业挂起的原因。

3 个答案:

答案 0 :(得分:0)

可以在数据流上计算平均值。请继续坚持以下内容:

  • 当前平均值
  • 元素数量

通过这种方式,您可以知道输入的号码和一批号码的重量。

以下是一些解决方案:

答案 1 :(得分:0)

对于平均值,使用单个reducer,为所有对发出相同的键,并为其找到平均值的值,如that(不使用组合器,因为平均值不是关联的) ,即平均值的平均值不是全球平均值)。 示例:

  Mapper 1中的

值:1,2,3   Mapper 2中的值:5,10

Mapper 1的平均值为2 =(1 + 2 + 3)/ 3。
Mapper 2的平均值为7.5 =(5 + 10)/ 2。
平均值为4.75 =(2 + 7.5)/ 2。
全球平均值为4.2 =(1 + 2 + 3 + 5 + 10)/ 5.

有关更详细的答案,包括使用合并器的棘手解决方案,请参阅my slides(从幻灯片7开始),灵感来自Donald Miner的书“MapReduce设计模式”。

对于最小值/最大值,请执行以下逻辑:

同样,您可以使用单个reducer,所有映射器始终发出相同的键,并且值是您要查找min / max的每个值。

组合器(与reducer相同)接收值列表并发出本地最小值/最大值。然后,单个减速器接收局部mins / maxs列表并发出全局最小值/最大值(min和max ARE associative)。

在伪代码中:

map (key, value):
emit (1, value);

reduce(key, list<values>): //same are combiner
min = first_value;
for each value
    if value <= min
        min = value;
emit (key, min);

答案 2 :(得分:0)

来自地图 将Key输出为NullWrittable,将值输出为(value of count,count) 在减速机 拆分值和计数 将值和计数分别求和 找到总和的值除以总计数 从reducer输出平均值。

逻辑2 创建一个可以保存计数和总和的Writable从map中传递此变量并使用单个reducer减少它