MapReduce框架中矩阵相乘的算法思路及其实现

本文探讨了在MapReduce环境中实现两个矩阵相乘的两种方法。第一种是基于传统的矩阵乘法规则,每个Map任务处理A的一行与B的一列,Reduce任务负责求和输出。第二种方法是矩阵分块相乘,已有大牛提供了源代码。实现过程中涉及重写InputSplit、InputFormat、Partition等,并需要自定义数据结构以确保数据正确流动。
摘要由CSDN通过智能技术生成

关于在mapreduce框架中的两个矩阵相乘(A*B)的算法实现,有如下两种思路。。

 

第一,因为我们在学校课堂内的矩阵相乘的基本算法就是A的行与B的列相乘 当然要满足A的列的维数与B的行维数相同,才能满足相乘的条件。所以有如下基本思路:

让每个map任务计算A的一行乘以B的一列,最后由reduce进行求和输出。这是最原始的实现方法:

 

假设A(m*n)  B(n*s)

map的输入的格式如下<<x,y>,<Ax,By>>    0=<x<m,0=<y<s,0=<z<n

其中 <x,y>是key,x代表A的行号,y代表B的列号,<<Ax,By>>是value,Ax代表A的第x行第z列的元素,By代表B的第y列的第z行的一个元素,

A的一行与B的一列输入到一个maptask中,我们只需要对每个键值对中的value的两个值相乘即可,输出一个<<x,y>,Ax*By>

然后到洗牌阶段,将相同的可以输入到一个Reduce task中,然后reduce只需对相同key的value列表进行Ax*By进行求和即可。这个算法说起来比较简单,但是如何控制split中的内容是主要的问题。

 

首先需要重写InputSplit,InputFormat,Partion,来控制数据的流动,在数据结构方面需要定义一个实现的WritableComparable借口的类来保存两个整数(因为前面的key和value都出现两个整数),而且对象可以排序。

IntPair.class实现

package com.zxx.matrix;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.io.WritableComparable;

public class IntPair implements WritableComparable
{
    
	private int right=0;
	private int left=0;
	
	public IntPair(){}
	
	public IntPair(int right,int left){
		this.right=right;
		this.left=left;
	}
	
	public int getRight(){
		return right;
	}
	
	public int getLeft(){
		return left;
	}
	public void s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值