【甘道夫】MapReduce实现矩阵乘法--实现代码

之前写了一篇分析MapReduce实现矩阵乘法算法的文章:

【甘道夫】Mapreduce实现矩阵乘法的算法思路

为了让大家更直观的了解程序运行,今天编写了实现代码供大家參考。


编程环境:

java version "1.7.0_40"

Eclipse Kepler

Windows7 x64

Ubuntu 12.04 LTS

Hadoop2.2.0

Vmware 9.0.0 build-812388


输入数据:

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

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

matrixa文件已处理为(x,y,value)格式:

0 0 3

0 1 4

0 2 6

1 0 4

1 1 0

1 2 8



B矩阵存放地址:hdfs://singlehadoop:8020/workspace/dataguru/hadoopdev/week09/matrixmultiply/matrixB/matrixb

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

matrixb文件已处理为(x,y,value)格式:

0 0 2

0 1 3

1 0 3

1 1 0

2 0 4

2 1 1


实现代码:

一共三个类:

  • 驱动类MMDriver
  • Map类MMMapper
  • Reduce类MMReducer

大家可依据个人习惯合并成一个类使用。


package dataguru.matrixmultiply;

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;

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/workspace/dataguru/hadoopdev/week09/matrixmultiply/matrixA");
		Path inPathB = new Path("hdfs://singlehadoop:8020/workspace/dataguru/hadoopdev/week09/matrixmultiply/matrixB");
		Path outPath = new Path("hdfs://singlehadoop:8020/workspace/dataguru/hadoopdev/week09/matrixmultiply/matrixC");
		FileInputFormat.addInputPath(job, inPathA);
		FileInputFormat.addInputPath(job, inPathB);
        FileOutputFormat.setOutputPath(job,outPath);

		// 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);
	}
}
package dataguru.matrixmultiply;



import java.io.IOException;

import java.util.StringTokenizer;



import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Mapper;

import org.apache.hadoop.mapreduce.lib.input.FileSplit;



public class MMMapper extends Mapper
package dataguru.matrixmultiply;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.StringTokenizer;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.Reducer.Context;

public class MMReducer extends Reducer {

	public void reduce(Text key, Iterable values, Context context)
			throws IOException, InterruptedException {

		Map matrixa = new HashMap();
		Map matrixb = new HashMap();
		
		for (Text val : values) {   //values example : b,0,2   or   a,0,4
			StringTokenizer str = new StringTokenizer(val.toString(),",");
			String sourceMatrix = str.nextToken();
			if ("a".equals(sourceMatrix)) {
				matrixa.put(str.nextToken(), str.nextToken());  //(0,4)
			}
			if ("b".equals(sourceMatrix)) {
				matrixb.put(str.nextToken(), str.nextToken());  //(0,2)
			}
		}
		
		int result = 0;
		Iterator iter = matrixa.keySet().iterator();
		while (iter.hasNext()) {
			String mapkey = iter.next();
			result += Integer.parseInt(matrixa.get(mapkey)) * Integer.parseInt(matrixb.get(mapkey));
		}

		context.write(key, new Text(String.valueOf(result)));
	}
}

终于输出结果:

0,0 42
0,1 15
1,0 40
1,1 20

转载于:https://www.cnblogs.com/xfgnongmin/p/10749486.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值