设矩阵A大小为m*p,矩阵B大小为p*n,C=A*B,C的大小为m*n。矩阵中每个元素的行号和列号均从1开始,矩阵C可以通过下面的公式计算得到。

实现方案1

在文件中每一行存储矩阵中的一个元素,每一行格式如下:

上面是Map Task的输入,对于每一行输入Map Task的输出中key和value的格式是:

对于Map Task,每一行输入,有n个输出。

n为1,故对矩阵A,Map的输出是:

矩阵B的文件格式和A相同,对于每一行输入Map Task的输出中key和value的格式是:

m为3。故对矩阵B,对于每一行输入,Map Task的输出中key和value的格式是:

在Reduce过程中输入的相同的键的值将放在一起,例如对于键1#1,Reduce的输入中,values为:

构造两个向量(也就是数组)a和b,a[1]=2,a[2]=3,b[1]=2,b[2]=7,将a和b点乘,得到2*2+3*7=25,故C[11] = 25。 Reduce的输出中key和value的格式是:

矩阵C在[ij]处元素的值,其实就是矩阵A第i行、矩阵B第j列的点乘结果,所以可以让Map的输入的每个数据就是矩阵的一行或者一列。

对于矩阵A,数据文件中每行存储矩阵的一行,每行格式如下:

对于矩阵B,数据文件中每行存储矩阵的一列,每行格式如下:

以上的Map Task的输入。 对于矩阵A,每一行数据转换为:

对于矩阵B,每一列数据转换为:

Map Task的输出将作为Reduce Task的输入。在Reduce过程中输入的相同的键的值将放在一起,例如对于键1#1,Reduce的输入中,values为:

将向量23与向量27点乘结果为25,所有C[11]=25。

矩阵乘法还有其他的MapReduce实现思路,例如分块计算,这里暂且不做介绍了。