您的位置:首页 > 运维架构

Vector Multiplication with Map-Reduce

2016-07-05 10:06 183 查看

Vector Multiplication

Task: multiply 2 arrays of N numbers

A basic mathematical operation

Let’s assume N is very large

向量乘法问题描述:



当N非常大时,如何使用map-reduce解决?

所以,先回想一下map之前,是不是先要将文件spilt一下?



但是问题来了,spilt之后,如何知道哪个跟哪个是对应的呢?因为这个切分后的文件里面都只有数值,并没有标号,也就是没有<key,value>中的key,只有value

Hadoop提供解决方法:



Map阶段对数据进行标记,以行号作为key,值作为value,mapper的主要作用是标记数据



Shuffle阶段:



Reduce阶段:

我们已经知道每行对应的数值了,比如说(1,5),(1,2.7)对应的是A的第一行的5,和B的第一行的2.7,那么他们的乘积也就可得了,以此类推,得到的结果进行累加,即可得到A,B向量乘法的结果了



Computational Costs

For Vector Multiplication

How many <index,number> are output from map()?

2个向量,一个key,一个value,N行,显而易见,会输出2N个<index,number>



How many<index> groups have to be shuffled?



Can we reduce shuffling?

Try: ‘combine’ map indices in mapper (works better for Wordcount)

hadoop中的combine函数,本质上是一个本地的reducer。其设计初衷是在本地将需要reduce操作的数据就行合并,以减少不必要的通信代价,combine可以提高hadoop的运行性能。

因为combine的输入是map的输出,combine的输出是reduce的输入, 而map的输出和reduce的输出是一致的,所以,我们需要确保combine的输入和输出是一样的, 另外还要考虑本地的reduce对最终的结果是否有影响,比如wordcount,他在本地做累加对最终的结果是没有影响,可以使用combine; 但是计算平均数就不行了,主要这个过程有信息的丢失。

Or Try: use index ranges of length R



将原先的N行数据,分为N/R行。



比如说原先的第一行数据5,这时候由<1,5>变为<1,1,5>

此时如何计算向量乘法呢?

可以这样想,先通过index bin定位到具体的bin中,在具体的bin中,通过original-index定位到具体的行号,然后进行计算。

此时的shuffling的花费取决于N/R个group



平衡计算花费:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Mapreduce vector hadoop