矩陣-向量乘法實現
Map函數
Map函數應用於M的一個元素,但是如果執行Map任務的計算節點還沒有將v讀到內存,那么首先以一個整體的方式讀入v,然后v就可以被該Map任務中執行的Map函數所用。每個Map任務將整個向量v和矩陣M的一個文件塊作為輸入。對每個矩陣元素\(m_{ij}\),Map任務會產生鍵值對\((i,m_{ij}v_{j})\)。因此,計算\(x_i\)的所有n個求和項\(m_{ij}v_j\)。
Reduce函數
Reduce函數簡單地將所有與給定鍵i關聯的值相加即得到結果\((i,x_i)\)。
向量v太大無法放入內存
把矩陣分割成多個寬度相等的垂直條,同時將向量分割成同樣數目的水平條。我們的目標是使用足夠的條以保證向量的每個條能夠方便地放入計算節點的內存中。
矩陣-矩陣乘法
矩陣\(M\)中第\(i\)行第\(j\)列的元素記為\(m_{ij}\),矩陣\(N\)中第\(j\)行第\(k\)列的元素記為\(n_{jk}\),矩陣\(P=MN\),其第\(i\)行第\(k\)列的元素記為\(p_{ik}\),
Map函數
對每個矩陣元素\(m_{ij}\)產生鍵值對\((j,(M,i,m_{ij}))\),對每個矩陣元素\(n_{jk}\)產生鍵值對\((j,(N,k,n_{jk}))\)。
Reduce函數
對每個鍵\(j\),對每個\((M,i,m_{ij})\)和\((N,k,n_{jk})\),產生鍵值對,其中鍵為\((i,k)\),值為\(m_{ij}n_{jk}\)。
Reduce函數
對每個鍵\((i, k)\),計算與此鍵相關聯的所有值的和,記為\(((i,k),v)\)
以下是使用Spark來實現上面矩陣與矩陣相乘的算法,輸入是一份文件,文件的每一行為矩陣名 行號 列號 值
。