【Hadoop】矩阵相乘MapReduce实现
Method 1
A:M*K
B: k*N
Input
A : M行 sequenceFIle <Int,Array(k)>
B: N 行 sequenceFIle <Int,Array(k)>
Map:
If read line from A
For j = 1->N
Collect(<(linenum,j), vector(k)>)
If read line from B
For I = 1->M
Collect(<(i,linenum)>,vector(k)>)
Reduce:
Vi = iterator.next()
Result = v1*v2
Output(<I,j>,result);
优点:逻辑简单,直接
缺点数据打散,还需要一次mapreduce还原成矩阵。
对Map 修改可以分块进行 可以大大减少空间占用
原来相当于分块数 F = M or N 空间复杂度 为 (N*M+M*N)*K =O(2 M*N *K)
如果指定分块个数 F 为常数 空间复杂度 为 O ((M+N)*K)
只要F <= 0.5*(M+N)
Method2
A:M*K
B: k*N
同时读入
Input
A : K行 sequenceFIle <Int,Array(M) m>
B: K 行 sequenceFIle <Int,Array(N) n>
Map
For i = 1->M:
For j = 1 ->N:
n[j]= m[i]*n[j]
collect(<i, Array(N) n)>
Reduce
SumVector[N]
While(iterator.hasNext())
for j= 1->N
SumVector[j] += iterator.next()[j]
collect(<i,SumVector[N]>)
output : M*N matrix
优点直接生成矩阵
缺点需要同时读入两个数据,map不好实现,也需要先通过一个mapreduce merge