当前位置: 游戏平台 > 互联网科技 > 正文

MapReduce完毕矩阵乘法--实现代码

时间:2019-11-05 23:44来源:互联网科技
大数量计算中时常会遇见矩阵乘法总计难题,所以Mapreduce完毕矩阵乘法是尤为重要的底工知识,下文作者尽量用浅显的言语陈说该算法。 后面写了意气风发篇深入分析MapReduce落成矩阵乘

大数量计算中时常会遇见矩阵乘法总计难题,所以Mapreduce完毕矩阵乘法是尤为重要的底工知识,下文作者尽量用浅显的言语陈说该算法。

后面写了意气风发篇深入分析MapReduce落成矩阵乘法算法的稿子:Mapreduce达成矩阵乘法的算法思路 http://www.linuxidc.com/Linux/2014-09/106646.htm

1.首先回想矩阵乘法功底

为了让我们越来越直观的刺探程序推行,后日编辑了落到实处代码供大家仿效。

矩阵A和B能够相乘的前提是,A的列数和B的行数相似,因为乘法结果的矩阵C中每多个要素Cij,是A的第i行和B的第j列做点积运算的结果,参见下图:

编制程序情况:

图片 1

  • java version "1.7.0_40"
  • Eclipse Kepler
  • Windows7 x64
  • Ubuntu 12.04 LTS
  • Hadoop2.2.0
  • Vmware 9.0.0 build-812388 

2.踏入正题

输入数据:

在打听了矩阵乘法准绳后,大家筹划接受布满式计算模型Mapreduce来成功那风姿浪漫经过。

A矩阵存放地方:hdfs://singlehadoop:8020/wordspace/dataguru/hadoopdev/week09/matrixmultiply/matrixA/matrixa

MEnclave进度是在Hadoop集群的多台机器上同一时候实行的,所以能M揽胜极光化的乘除必需是未曾前后关系、相互独立的经过。通过解析上述矩阵乘法进度大家得以发掘,其实C矩阵的每四个因素的总括进程都以互相独立的,例如C11和C21的揣度不会相互影响,能够并且张开。

A矩阵内容:
3 4 6
4 0 8

故此,大家的靶子就转换为:通过M翼虎总括每二个C矩阵成分Cij。

 B矩阵贮存地方:hdfs://singlehadoop:8020/wordspace/dataguru/hadoopdev/week09/matrixmultiply/matrixB/matrixb

针对以上对象我们更加的深入分析,Cij其实正是A矩阵的第i行和B矩阵的第j列的点积,所以我们如若能最后将参与计算Cij的兼具因素(A矩阵的第i行和B矩阵的第j列卡塔 尔(英语:State of Qatar)都归到一组来参与计算就能够算出Cij。这些所谓的“归到意气风发组”,结合M冠道模型和矩阵乘法则则,其实正是Map将这一个因素输出为同意气风发的Key---C矩阵凉月素的坐标,然后通过Shuffle就能够把具有同意气风发Key的元素输入到Reduce中,由Reduce来展开点积运算,得出该C元素最后的值。

B矩阵内容:
2 3
3 0
4 1

OK,上边的思绪都看掌握后,我们回来输入数据,即A和B八个矩阵,大家只需求将矩阵中的每一种成分管理一下(该进度须求在Map中张开卡塔 尔(英语:State of Qatar),遵照每贰个成分将要参与哪些Cij的计量,为每二个因素打上(i,j卡塔 尔(英语:State of Qatar)坐标就能够,这样结尾这个要素就能被shuffle到目的Cij的精兵简政数据源分组中。

落到实处代码:

切实比方,A12,会出席到C11,C12的计量中;B22会参预到C12,C22的乘除中。所以,大家从A和B的要素坐标,就全盘能够识破它们将要参加计算的C成分的坐标。注意,这里是黄金年代对多的,各个A可能B的要素都会参加四个C成分的酌量,假若不明了请再看率先遍矩阵乘准绳则。

累计四个类:

  • 由此上述的解析,对于叁个i行j列的A矩阵,和j行k列的B矩阵乘法:
  • 咱俩将每种Aij成分管理为如下格式:
  • key=i,n(n=1,2,3...k)      value='a','j',aij
  • 笔者们将各样Bjk管理为如下格式:
  • key= m,k(m=1,2,3...i)    value='b',
  • 驱动类MMDriver
  • Map类MMMapper
  • Reduce类MMReducer

地方那么些格式恐怕过四人看得难熬,我就再唠叨两句,拿A12来比喻,参见下图:

世家可依照个体习于旧贯归拢成二个类应用。

图片 2

MMDriver.java

A12提起底会出席C11,C12的总计,所以大家处理A12时需将其拍卖为多少个{key,value}对:

package dataguru.matrixmultiply;

{(1,1),('a' , 2 , 2)}          /*  (1,1)是A12将涉香港足球总会计的C11的坐标;'a'代表该数量来源A矩阵,因为A和B必要相乘,所以须求做一个注明位;头三个2表示那是计算C11时对应A向量的坐标,因为要知道A向量的第多少个要素和B向量的第多少个成分相乘;最终叁个2便是现阶段成分的值  */

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

{(1,2),('a' , 2 , 2)}          /*  参谋以上描述  */

public class MMDriver {
 
 public static void main(String[] args) throws Exception {
 
  // set configuration
  Configuration conf = new Configuration();

如此解释都看不懂,就自个儿面壁去哈!

  // create job
  Job job = new Job(conf,"MatrixMultiply");
  job.setJarByClass(dataguru.matrixmultiply.MMDriver.class);
 
        //  specify Mapper & Reducer
  job.setMapperClass(dataguru.matrixmultiply.MMMapper.class);
  job.setReducerClass(dataguru.matrixmultiply.MMReducer.class);
 
  // specify output types of mapper and reducer
  job.setOutputKeyClass(Text.class);
  job.setOutputValueClass(Text.class);
  job.setMapOutputKeyClass(Text.class);
  job.setMapOutputValueClass(Text.class);
 
  // specify input and output DIRECTORIES
  Path inPathA = new Path("hdfs://singlehadoop:8020/wordspace/dataguru/hadoopdev/week09/matrixmultiply/matrixA");
  Path inPathB = new Path("hdfs://singlehadoop:8020/wordspace/dataguru/hadoopdev/week09/matrixmultiply/matrixB");
  Path outPath = new Path("hdfs://singlehadoop:8020/wordspace/dataguru/hadoopdev/week09/matrixmultiply/matrixC");
  FileInputFormat.addInputPath(job, inPathA);
  FileInputFormat.addInputPath(job, inPathB);
        FileOutputFormat.setOutputPath(job,outPath);

OK,Map进程甘休,全数参加Cij的的A、B成分都shuffle到同多少个Reduce了,Reduce的算法思路就轻便了,通过标记位分别数据来自(A或B卡塔 尔(阿拉伯语:قطر‎创设数组,然后四个数组做点积就能够。

  // delete output directory
  try{
   FileSystem hdfs = outPath.getFileSystem(conf);
   if(hdfs.exists(outPath))
    hdfs.delete(outPath);
   hdfs.close();
  } catch (Exception e){
   e.printStackTrace();
   return ;
  }
 
  //  run the job
  System.exit(job.waitForCompletion(true) ? 0 : 1);
 }
}

Ubuntu 13.04上搭建Hadoop环境 http://www.linuxidc.com/Linux/2013-06/86106.htm

MMMapper.java

Ubuntu 12.10 +Hadoop 1.2.1本子集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

package dataguru.matrixmultiply;

编辑:互联网科技 本文来源:MapReduce完毕矩阵乘法--实现代码

关键词:

  • 上一篇:没有了
  • 下一篇:没有了