矩阵乘法的Mapreduce实现过程

MapReduce实现矩阵的乘法

在学习pageRank算法时看到这么一个小小的编程应用。并且一直自诩只要有原理就能写出代码(只是时间问题),矩阵乘法的原理很简单,基本上理工科生(只要学过线性代数或者相关课程)都知道。但是从来没有想过通过并行计算的方式来完成矩阵乘法。

这里矩阵的知识就不啰嗦了,矩阵的乘积记作为P=M*N。则P中的元素


         简单粗暴的讲,就是左矩阵M的行依次与右矩阵的列元素对应相乘,然后再相加。

         可能说到mapreduce算法可能都会想到map用来整理数据(这里指的就是矩阵中的元素),然后送至reduce中计算。说起来是挺简单的,但是从无到有的过程还是不容易的。关键是key值的设计,可以说一个key的设计是编程成功的一半。

         下面详细的道来设计过程。


相信大家都关注到了<k,v>对里面的M: 和N:字样。这个得郑重声明一下,其实不用也可以,但是value值这样设置后很容易维护和调试代码(具体的可以参看以下陆嘉恒的《hadoop实战》关于单表关联的章节),因为能清晰看出元素的出处。必须要说明的是M:和N:后面的数字特别重要,M:y的y表示元素对应的列号;N:x的x表示元素对应的行号。这样说明之后是不是思路就清晰了,把这样的<k,v>上传给reduce,reduce收到的是〈k, list(v)〉,源代码的System.out.print("tuple==" + MN[0] + ":" + MN[1] +"\t");就能看得明白map的内容。List(v)就是如下的样子。


到了,这里map过程就结束了,下面就是reduce的过程。刚才说了那个x/y很重要,现在就体现出来了,起到标志位的作用。在一个list里面标志位相同的元素相乘就是,再相加就是对应结果。是不是小有成就感。

下面来简单的谈谈MR程序的实现。MR框架还是比较简单,相信初上手的时候都会拿wordcount程序入门,下面就是就是从hadoop自带的wordcount里面抽取出来的MR框架。

publicclass wordCount {

         publicstaticclass mulMapperextends Mapper<Object, Text, Text, Text> {

 

                   publicvoid map(Object key, Text value, Context context)

                                     throws IOException, InterruptedException {

                  

                  }

         }

 

         publicstaticclass mulReducerextends Reducer<Text, Text, Text, Text> {

 

                   publicvoid reduce(Text key, Iterable<Text> values, Context context)

                                     throws IOException, InterruptedException {

         …

                  }

         }

 

         publicstaticvoid main(String[] args)throws Exception {

                   Configuration conf = new Configuration();

                   String[] otherArgs = new GenericOptionsParser(conf, args)

                                     .getRemainingArgs();

                   if (otherArgs.length != 2) {

                            System.err.println("Usage: wordcount <in> <out>");

                            System.exit(2);

                   }

                   //对重复出现的目录处理

                   FileSystem fs = FileSystem.get(URI.create(otherArgs[1]), conf);

                   Path inpath = new

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MapReduce是一种用于处理大规模数据集的编程模型。在实现矩阵乘法时,可以使用MapReduce来进行并行计算。具体实现步骤如下: 1. Map阶段:将输入的矩阵A和矩阵B进行预处理,生成键值对。键表示矩阵C中的元素位置,值表示来自矩阵A和矩阵B的元素。 2. Shuffle阶段:根据键对生成的键值对进行分组,将具有相同键的数据对发送到同一个Reduce任务中。 3. Reduce阶段:对于每个Reduce任务,接收到的键值对中的键表示矩阵C中的元素位置,值表示来自矩阵A和矩阵B的元素。通过对值进行相乘和求和的操作,计算出矩阵C中对应位置的元素。 需要注意的是,由于数据量很大时容易造成内存溢出,所以在实际应用中,还需要采取其他转换方式,如行列相乘运算、分块矩阵运算等,以减少内存的使用。此外,上述代码示例中缺少了对错误数据的过滤处理,实际应用中需要根据具体情况进行错误数据的处理。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [MapReduce实现矩阵乘法](https://blog.csdn.net/conansix/article/details/39958957)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值