1. 程式人生 > >大矩陣乘法運算map reduce實現思路

大矩陣乘法運算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每個元素的值。