這期內容當中小編將會給大家?guī)碛嘘Pmapreduce中怎么實現(xiàn)矩陣相乘,文章內容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設、網(wǎng)站設計、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務株洲,十年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18980820575
設,
,那么
矩陣乘法要求左矩陣的列數(shù)與右矩陣
的行數(shù)相等,
的矩陣
,與
的矩陣
相乘,結果為
的矩陣
。
現(xiàn)在我們來分析一下,哪些操作是相互獨立的(從而可以進行分布式計算)。很顯然,的計算和
的計算是互不干擾的;事實上,
中各個元素的計算都是相互獨立的。這樣,我們在Map階段,可以把計算
所需要的元素都集中到同一個key中,然后,在Reduce階段就可以從中解析出各個元素來計算
;
的其他元素的計算同理。
我們還需要注意,會被
、
……
的計算所使用,
會被
、
……
的計算所使用。也就是說,在Map階段,當我們從HDFS取出一行記錄時,如果該記錄是
的元素,則需要存儲成
個<key, value>對,并且這
個key互不相同;如果該記錄是
的元素,則需要存儲成
個<key, value>對,同樣的,
個key也應互不相同;但同時,用于計算
的、存放
、
……
和
、
……
的<key, value>對的key應該都是相同的,這樣才能被傳遞到同一個Reduce中。
經(jīng)過以上分析,整個計算過程設計為:
(1)在Map階段,把來自表的元素
,標識成
條<key, value>的形式。其中
,
;把來自表
的元素
,標識成
條<key, value>形式,其中
,
。
于是乎,在Map階段,我們實現(xiàn)了這樣的戰(zhàn)術目的:通過key,我們把參與計算的數(shù)據(jù)歸為一類。通過value,我們能區(qū)分元素是來自
還是
,以及具體的位置。
(2)在Shuffle階段,相同key的value會被加入到同一個列表中,形成<key, list(value)>對,傳遞給Reduce,這個由Hadoop自動完成。
(3)在Reduce階段,有兩個問題需要自己問問:
當前的<key, list(value)>對是為了計算的哪個元素?
list中的每個value是來自表或表
的哪個位置?
第一個問題可以從key中獲知,因為我們在Map階段已經(jīng)將key構造為形式。第二個問題,也可以在value中直接讀出,因為我們也在Map階段做了標志。
接下來我們所要做的,就是把list(value)解析出來,來自的元素,單獨放在一個數(shù)組中,來自
的元素,放在另一個數(shù)組中,然后,我們計算兩個數(shù)組(各自看成一個向量)的點積,即可算出
的值。
示例矩陣和
相乘的計算過程如下圖所示:
其中map階段:
public static class MatrixMap extends Mapper<Object, Text, Text, Text>{ private int sum3 = 0; //存放矩陣a的行數(shù) private int sum4 = 0; //存放矩陣b的行數(shù) @Override protected void map(Object key, Text value, Context context) throws IOException, InterruptedException { String[] lines = value.toString().split(","); String url = ((FileSplit)context.getInputSplit()).getPath().toString(); //取出文件路徑名,判斷數(shù)據(jù)來源分別增加其行數(shù) if(url.contains("matrix3")) sum3++; if(url.contains("matrix4")) sum4++; for(int m = 0; m < lines.length; m++){ // 遍歷矩陣列數(shù),分別與行數(shù)組成key為(i,k),value為(a,j,v)的數(shù)據(jù)輸出 if(url.contains("matrix3") && lines.length == matrix_j){ for (int i = 1; i <= matrix_k; i++){ context.write(new Text(sum3+","+i), new Text("a,"+(m+1)+","+lines[m])); } }else if(url.contains("matrix4") && lines.length == matrix_k){ for (int i = 1; i <= matrix_i; i++){ context.write(new Text(i+","+(m+1)), new Text("b,"+sum4+","+lines[m])); } } } } }
reduce階段:
public static class MatrixReduce extends Reducer<Text, Text, Text, Text>{ private Map<Integer, Integer> matrix_a; private Map<Integer, Integer> matrix_b; @Override protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { matrix_a = new HashMap<Integer, Integer>(); matrix_b = new HashMap<Integer, Integer>(); for(Text value : values){ //循環(huán)分辨values中值是矩陣a或是b的,并存入map集合a和b中 String line = value.toString(); if(line.startsWith("a,")){ String[] lines = line.split(","); if(lines.length == 3) matrix_a.put(Integer.parseInt(lines[1]), Integer.parseInt(lines[2])); }else{ String[] lines = line.split(","); if(lines.length == 3) matrix_b.put(Integer.parseInt(lines[1]), Integer.parseInt(lines[2])); } } int a_value = 0; int b_value = 0; int result = 0; //分別取出a和b集合中,計算結果放入result中 for(int i = 1; i <= matrix_j; i++){ if(matrix_a.get(i) != null && matrix_b.get(i) != null){ a_value = matrix_a.get(i); b_value = matrix_b.get(i); result += a_value * b_value; } } context.write(key, new Text(result+"")); } }
主程序:
public static void run(String time, Configuration conf) throws IOException, ClassNotFoundException, InterruptedException{ // 需求輸出文件路徑 String outpath = VALUE_FSNAME+ "/data/test_out/zk/matrix-"+time; // 需求輸入文件路徑 String input1 = VALUE_FSNAME+"/data/test_in/matrix3"; String input2 = VALUE_FSNAME+"/data/test_in/matrix4"; File jarFile = EJob.createTempJar("bin"); @SuppressWarnings("deprecation") Job job = new Job(conf, "Test-Matrix"); job.setJarByClass(TestMatrix1.class); job.setMapperClass(MatrixMap.class); job.setReducerClass(MatrixReduce.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); job.setNumReduceTasks(1); job.setInputFormatClass(TextInputFormat.class); job.setOutputFormatClass(TextOutputFormat.class); FileInputFormat.addInputPaths(job, input1+","+input2);; FileOutputFormat.setOutputPath(job, new Path(outpath)); // 提交job if (job.waitForCompletion(true)) { System.err.println("計算完成!"); } else { System.err.println("error!請檢查程序!"); } }
最后,大家請看一下原始數(shù)據(jù):
matrix1:
1,2,3 4,5,0 7,8,9 10,11,12
matrix2:
10,15 0,2 11,9
上述就是小編為大家分享的mapreduce中怎么實現(xiàn)矩陣相乘了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站標題:mapreduce中怎么實現(xiàn)矩陣相乘
本文地址:http://www.chinadenli.net/article36/jcossg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、外貿(mào)網(wǎng)站建設、品牌網(wǎng)站設計、軟件開發(fā)、電子商務、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)