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

wfypjpf4  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(365)

我正在编写简单的mapreduce程序来查找数据(许多文本文件)中的平均值、最小值和最大值。我想使用组合器在单个Map器首先处理的数字中查找所需的内容会使它更高效。
然而,我担心的是,为了能够找到平均数、最小数或最大数,我们需要将来自所有Map器(以及所有合并器)的数据放到一个简化器中,这样我们才能找到通用平均数、最小数或最大数。如果数据集较大,这将是一个巨大的瓶颈。
我确信在hadoop中会有一些方法来处理这个问题,我可能想不出来。有人能指导我吗?我在几次采访中也被问到过这样的问题。
在运行“查找平均值”mapreduce程序时,我还面临一个问题,唯一正在运行的Map器太长时间无法完成。我也增加了Map任务的超时时间,但它仍然会卡住。然而在标准输出日志的帮助下,我发现我的Map器和组合器执行得很顺利。因此,我无法找出是什么原因导致我的mapreduce作业挂起。

uyhoqukh

uyhoqukh1#

在reducer中,从map输出键为nullwritetable,值为(值之和,count)拆分值和count sum值和count分别查找总和除以总计数的值输出reducer的平均值。
逻辑2创建一个可写的,它可以保存count和sum,从map传递这个变量,并用一个reducer对其进行缩减

np8igboo

np8igboo2#

对于平均值,使用一个reducer,为所有对和要查找其平均值的值发出相同的键,例如值(没有组合器,因为平均值不是关联的,即平均值的平均值不是全局平均值)。例子:
Map器1中的值:1、2、3
Map器2中的值:5、10
Map器1的平均值为2=(1+2+3)/3。
Map器2的平均值为7.5=(5+10)/2。
平均值的平均值为4.75=(2+7.5)/2。
全球平均值为4.2=(1+2+3+5+10)/5。
要获得更详细的答案,包括使用组合器的棘手解决方案,请参阅我的幻灯片(从幻灯片7开始),其灵感来自donald miner的书“mapreduce设计模式”。
对于最小值/最大值,执行以下逻辑:
同样,您可以使用一个reducer,所有Map器始终发出相同的键,并且值是您要查找的最小值/最大值中的每一个值。
组合器(与reducer相同)接收值列表并发出局部最小值/最大值。然后,单个reducer接收局部最小值/最大值列表并发出全局最小值/最大值(最小值和最大值是关联的)。
在伪代码中:

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);
s5a0g9ez

s5a0g9ez3#

可以在数据流上计算平均值。试着坚持以下几点:
当前平均值
元件数量
这样你就知道一个输入的数字和一批数字的权重。
以下是一些解决方案:
从整数流中查找中间值
数字流平均值

相关问题