文档章节

矩阵乘法的mapreduce程序实现

南寻
 南寻
发布于 2017/05/25 20:36
字数 564
阅读 75
收藏 0

map函数:对于矩阵M中的每个元素m(ij),产生一系列的key-value对<(i,k),(M,j,m(ij))>

其中k=1,2.....知道矩阵N的总列数;对于矩阵N中的每个元素n(jk),产生一系列的key-value对<(i , k) , (N , j ,n(jk)>, 其中i=1,2.......直到i=1,2.......直到矩阵M的总列数。

map

package com.cb.matrix;

import static org.mockito.Matchers.intThat;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileSplit;
import org.apache.hadoop.mapreduce.Mapper;

import com.sun.org.apache.bcel.internal.generic.NEW;


public class MatrixMapper extends Mapper<Object, Text, Text, Text> {
	private Text map_key=new Text();
	private Text map_value= new Text();
	private int columnN;
	private int rowM;
	/**
	 * 执行map()函数前先由conf.get()得到main函数中提供的必要变量
	 * 也就是从输入文件名中得到的矩阵维度信息
	 */
	
	@Override
	protected void setup(Mapper<Object, Text, Text, Text>.Context context) throws IOException, InterruptedException {
		// TODO Auto-generated method stub
		Configuration config=context.getConfiguration();
		columnN=Integer.parseInt(config.get("columnN"));
		rowM =Integer.parseInt(config.get("rowM"));
	}
	
	@Override
	protected void map(Object key, Text value, Mapper<Object, Text, Text, Text>.Context context)
			throws IOException, InterruptedException {
		// TODO Auto-generated method stub
		//得到文件名,从而区分输入矩阵M和N
		FileSplit fileSplit=(FileSplit)context.getInputSplit();
		String fileName=fileSplit.getPath().getName();
		
		if (fileName.contains("M")) {
			String[] tuple =value.toString().split(",");
			int i =Integer.parseInt(tuple[0]);
			String[] tuples=tuple[1].split("\t");
			int j=Integer.parseInt(tuples[0]);
			int Mij=Integer.parseInt(tuples[1]);
			for(int k=1;k<columnN+1;k++){
				map_key.set(i+","+k);
				map_value.set("M"+","+j+","+Mij);
				context.write(map_key, map_value);
			}
			
		}
		else if(fileName.contains("N")){
			String[] tuple=value.toString().split(",");
			int j=Integer.parseInt(tuple[0]);
			String[] tuples =tuple[1].split("\t");
			int k=Integer.parseInt(tuples[0]);
			int Njk=Integer.parseInt(tuples[1]);
			for(int i=1;i<rowM+1;i++){
				map_key.set(i+","+k);
				map_value.set("N"+","+j+","+Njk);
				context.write(map_key, map_value);
			}
		}
		
	}

}

reduce函数:对于每个键(i,k)相关联的值(M,j,m(ij))及(N,j,n(jk)),根据相同的j值将m(ij)和n(jk)分别存入不同的数组中,然后将俩者的第j个元素抽取出来分别相乘,最后相加,即可得到p(jk)的值。

reducer

package com.cb.matrix;


import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;



public class MatrixReducer extends Reducer<Text, Text, Text, Text> {
	private int sum=0;
	private int columnM;
	@Override
	protected void setup(Reducer<Text, Text, Text, Text>.Context context) throws IOException, InterruptedException {
		// TODO Auto-generated method stub
		Configuration conf =context.getConfiguration();
		columnM=Integer.parseInt(conf.get("columnM"));
	}
	@Override
	protected void reduce(Text arg0, Iterable<Text> arg1, Reducer<Text, Text, Text, Text>.Context arg2)
			throws IOException, InterruptedException {
		// TODO Auto-generated method stub
		int[] M=new int[columnM+1];
		int[] N=new int[columnM+1];
		
		for(Text val:arg1){
			String[] tuple=val.toString().split(",");
			if(tuple[0].equals("M")){
				M[Integer.parseInt(tuple[1])]=Integer.parseInt(tuple[2]);
				
			}else{
				N[Integer.parseInt(tuple[1])]=Integer.parseInt(tuple[2]);
			}
			for(int j=1;j<columnM+1;j++){
				sum+=M[j]*N[j];
			}
			arg2.write(arg0, new Text(Integer.toString(sum)));
			sum=0;
		}
	}

}

 

© 著作权归作者所有

南寻
粉丝 63
博文 90
码字总数 35772
作品 0
朝阳
程序员
私信 提问
MapReduce 矩阵乘法之我见

一、最简单的算法 把mn 和nl的矩阵A和B相乘,这估计是最容易想到的方法了: 把A(mn)的元素,每个发送l次,把B(nl)的元素每个发送m次。将发送到一起的数据相乘求和,得到最后的结果。 优点...

一只小桃子
2014/05/18
2.2K
5
使用 Hadoop 和 Mahout 实现推荐引擎

作为我之前博客的延续,在这篇博客中,我将探讨如何使用 Mahout 和 Hadoop 实现一个 推荐引擎 第一部分 介绍 MapReduce 和 为什么为了利用并行计算的优势,一些算法需要而重写 第二部分 我会...

oschina
2013/02/14
6.5K
5
MapReduce 算法 - 反序模式 (Order Inversion)

这一篇其它段落的一系列MapReduce算法在" Data-Intensive Text Processing with MapReduce"这本书上呈现。以前分别是 Local Aggregation , Local Aggregation PartII 和 Creating a Co-Occu......

可观
2013/01/25
3.1K
5
大数据教程(10.7)Mapreduce的其他补充(计数器、多job串联、参数优化等)

上一篇文章分析了自定义inputFormat(小文件合并)的实现,在此博主将继续Mapreduce的其他补充(计数器、多job串联、参数优化等)内容的分享。 一、计数器应用 在实际生产代码中,常常需要将...

em_aaron
2018/12/30
30
0
MapReduce: 一个巨大的倒退

前言 databasecolumn 的数据库大牛们(其中包括PostgreSQL的最初伯克利领导:Michael Stonebraker)最近写了一篇评论当前如日中天的MapReduce技术的文章,引发剧烈的讨论。我抽空在这儿翻译一...

ddatsh
2011/11/04
4.5K
7

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
13
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
10
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
12
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部