大矩陣乘法運算map reduce實現思路
實現思路:
儲存:
大矩陣很多都是稀疏矩陣,並且有可能有上百萬的行和上百萬的列。
那麼矩陣可以存在類似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每個元素的值。