实现思路:
存储:
大矩阵很多都是稀疏矩阵,并且有可能有上百万的行和上百万的列。
那么矩阵可以存在类似HBase面向列的分布式数据库中。
假设HTable中有两个表A和表B分别存储两个巨型矩阵a和b。表A和表B都是只有一个列族。列名都是1开始计数。
那么表A和表B所存储的矩阵a和矩阵b表示为如下形式:
矩阵a(m,n):
a11 a12 a13 ... a1n
a21 a22 a23 ... a2n
...
...
...
am1 am2 am3 ... amn
矩阵b(n,k):
b11 b12 b13 ... b1k
b21 b22 b23 ... b2k
...
...
...
bn1 bn2 bn3 ... bnk
计算:A*B = C
计算可以通过mapreduce这种分布式计算模型来计算。
Map阶段:
1、 从hbase中读取a表的数据aij,将其拆成k条<key,value>形式,其中key为<i,[1-k]>的键值对。Value为<0,j,aij>键值对。之所以这样做是因为aij在计算矩阵乘法过程中会被使用l次。而key值及是其对应的结果矩阵C中的下标。其中0代表该值来自A矩阵。
2、 从hbase中读取b表的数据bij,将其拆成m条<key,value>形式,其中key为<[1-m],j>的键值对。Value为<1,i,bij>键值对。之所以这样做是因为bij在计算矩阵乘法过程中会被使用l次。而key值及是其对应的结果矩阵C中的下标。其中1代表该值来自B矩阵。
Reduce阶段:
Shuffle以后会形成<key,List<value>>键值对,其中key 为<i,j>键值对,代表C矩阵下标。
值为<[0-1],[1-n],数值> 三元组。如果第一个数是0则表示来自矩阵A,如果是1表示来自矩阵B。这样根据第一个数的值将List<value>分成两组。然后第二个值相同的两个value对应的三元组中的最后一个数值两两相乘并求和。即可求出C每个元素的值。