python版 mapreduce 矩阵相乘
参考张老师的mapreduce 矩阵相乘。
转载请注明:来自chybot的学习笔记http://i.cnblogs.com/EditPosts.aspx?postid=4541939
下面是我用python版本的mapreduce 矩阵相乘。
矩阵相乘的思路详见张老师的博客,对于两个矩阵m1和m2,mapreduce的计算过程如下:
这里面最主要的地方是key的构成,map输出的key是相乘后的矩阵的下标,比如c[i][j] = sum(A[i][:]*B[:][j])。
注意:该实现知识矩阵相乘的一个思路的实现,并不适合真实场景,这里面map task只能为2(对应两个输入矩阵的文件),reduce task只能为1。
主要原因是由于这里面每个map程序都使用了全局变量,而每个reduce程序则默认矩阵相乘结果所需的值均在一个分片。
输入文件:
matrixA.txt
A#-1,0,2
A#1,3,1
matrixB.txt
B#3,1
B#2,1
B#1,0
maper程序:
#!/usr/bin/python
# -*-coding:utf-8 -*- import sys rowNum = 2
colNum = 2
rowIndexA = 1
rowIndexB = 1 def read_inputdata(splitstr):
for line in sys.stdin:
#分割出矩阵名和矩阵的一行元素
yield line.split(splitstr) if __name__ == '__main__':
for matrix, matrixline in read_inputdata('#'):
if matrix == 'A':
# 分割出矩阵元素(使用,分隔),并用key,value输出
for i in range(rowNum):
key = str(rowIndexA) + ',' + str(i+1)
value = matrix + ':'
j = 1
for element in matrixline.split(','):
print '%s\t%s%s,%s' % (key, value, j, element)
j += 1
rowIndexA += 1
elif matrix == 'B':
for i in range(colNum):
value = matrix + ':'
j = 1
for element in matrixline.split(','):
print '%s,%s\t%s%s,%s' % (i+1, j, value, rowIndexB, element)
j = j+1
rowIndexB += 1
else: continue
reduce程序:
#!/usr/bin/python
# -*- coding:utf-8 -*- import sys
from itertools import groupby
from operator import itemgetter def read_input(splitstr):
for line in sys.stdin:
line = line.strip()
if len(line) == 0: continue
yield line.split(splitstr, 1) def run():
data = read_input('\t')
for current_element, group in groupby(data, itemgetter(0)):
try:
matrixA = {}
matrixB = {}
result = 0
#获取A的一行和b的一列
for current_element, elements in group:
matrix, index_value = elements.split(':')
index, value = index_value.split(',')
if matrix == 'A':
matrixA[index] = int(value)
else:
matrixB[index] = int(value)
#计算相乘结果,注意一定要用下标,如果依赖mapreduce的sort可能会出错
for key in matrixA:
result += matrixA[key]*matrixB[key]
print '%s\t%s' % (current_element, result)
except Exception:
pass if __name__ == '__main__':
run()
本地测试是否可行:
bogon:program xuguoqiang$ cat matrixA.txt matrixB.txt |python matrix_mapper.py |sort |python matrix_reducer.py
1,1 -1
1,2 -1
2,1 10
2,2 4
使用hadoop streaming 运行mapred程序,结果如下:
bogon:hadoop-1.2.1 xuguoqiang$ bin/hadoop jar contrib/streaming/hadoop-streaming-1.2.1.jar -D mapred.map.tasks=2 -D mapred.reduce.tasks=1 \
> -mapper /Users/xuguoqiang/hadoop-1.2.1/program/matrix_mapper.py \
> -reducer /Users/xuguoqiang/hadoop-1.2.1/program/matrix_reducer.py \
> -input /matrix/* \
> -output output5
packageJobJar: [/tmp/hadoop-xuguoqiang/hadoop-unjar2547149142116420858/] [] /var/folders/7_/jmj1yhgx7b1_2cg9w74h0q5r0000gn/T/streamjob1502134034482177499.jar tmpDir=null
15/05/31 16:37:06 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
15/05/31 16:37:06 WARN snappy.LoadSnappy: Snappy native library not loaded
15/05/31 16:37:06 INFO mapred.FileInputFormat: Total input paths to process : 2
15/05/31 16:37:06 INFO streaming.StreamJob: getLocalDirs(): [/tmp/hadoop-xuguoqiang/mapred/local]
15/05/31 16:37:06 INFO streaming.StreamJob: Running job: job_201505311232_0019
15/05/31 16:37:06 INFO streaming.StreamJob: To kill this job, run:
15/05/31 16:37:06 INFO streaming.StreamJob: /Users/xuguoqiang/hadoop-1.2.1/libexec/../bin/hadoop job -Dmapred.job.tracker=hdfs://localhost:9001 -kill job_201505311232_0019
15/05/31 16:37:06 INFO streaming.StreamJob: Tracking URL: http://localhost:50030/jobdetails.jsp?jobid=job_201505311232_0019
15/05/31 16:37:07 INFO streaming.StreamJob: map 0% reduce 0%
15/05/31 16:37:11 INFO streaming.StreamJob: map 100% reduce 0%
15/05/31 16:37:20 INFO streaming.StreamJob: map 100% reduce 100%
15/05/31 16:37:22 INFO streaming.StreamJob: Job complete: job_201505311232_0019
15/05/31 16:37:22 INFO streaming.StreamJob: Output: output5
bogon:hadoop-1.2.1 xuguoqiang$ bin/hadoop fs -cat output5/*
1,1 -1
1,2 -1
2,1 10
2,2 4
可以看出,结果和在本地运行结果是相同的。
二、稀疏矩阵乘法
稀疏矩阵和矩阵乘法思想类似,只不过把之前一行的数据变成了多行来体现。
输入:
矩阵A
A#1,1,1
A#1,4,3
A#2,1,2
A#2,2,5
A#2,4,4
A#3,4,1
A#4,1,4
A#4,2,7
A#4,3,1
A#4,4,2
矩阵B
B#1,1,5
B#2,2,2
B#4,1,3
B#4,2,1
mapper程序:
#!/usr/bin/python
# -*-coding:utf-8 -*- import sys rowNum = 2
colNum = 4 def read_inputdata(splitstr):
for line in sys.stdin:
yield line.strip().split(splitstr) if __name__ == '__main__':
for matrix, matrixline in read_inputdata('#'):
if matrix == 'A':
for i in range(rowNum):
index1, index2, element = matrixline.split(',')
print '%s,%s\t%s:%s,%s' % (index1, (i+1), matrix, index2, element)
elif matrix == 'B':
for i in range(colNum):
index1, index2, element = matrixline.split(',')
print '%s,%s\t%s:%s,%s' % (i+1, index2, matrix,index1, element)
else: continue
reduce程序:
#!/usr/bin/python
# -*- coding:utf-8 -*- import sys
from itertools import groupby
from operator import itemgetter def read_input(splitstr):
for line in sys.stdin:
line = line.strip()
if len(line) == 0: continue
yield line.split(splitstr, 1) def run():
data = read_input('\t')
for current_element, group in groupby(data, itemgetter(0)):
try:
matrixA = {}
matrixB = {}
result = 0
for current_element, elements in group:
matrix, index_value = elements.split(':')
index, value = index_value.split(',')
if matrix == 'A':
matrixA[index] = int(value)
else:
matrixB[index] = int(value)
for key in matrixA:
if key in matrixB:
result += matrixA[key]*matrixB[key]
print '%s\t%s' % (current_element, result)
except Exception:
pass if __name__ == '__main__':
run()
本地程序测试结果:
bogon:program xuguoqiang$ cat sparsematrixB.txt sparsematrixA.txt | python sparsematrix_mapper.py |sort |python sparsematrix_reduce.py
1,1 14
1,2 3
2,1 22
2,2 14
3,1 3
3,2 1
4,1 26
4,2 16
hadoop测试结果:
bogon:hadoop-1.2.1 xuguoqiang$ bin/hadoop jar contrib/streaming/hadoop-streaming-1.2.1.jar -D mapred.map.tasks=2 -D mapred.reduce.tasks=1 -mapper /Users/xuguoqiang/hadoop-1.2.1/program/sparsematrix_mapper.py -reducer /Users/xuguoqiang/hadoop-1.2.1/program/sparsematrix_reduce.py -input /sparsematrix/* -output output
packageJobJar: [/tmp/hadoop-xuguoqiang/hadoop-unjar2334049571009138288/] [] /var/folders/7_/jmj1yhgx7b1_2cg9w74h0q5r0000gn/T/streamjob7964024689233782754.jar tmpDir=null
15/05/31 16:31:11 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
15/05/31 16:31:11 WARN snappy.LoadSnappy: Snappy native library not loaded
15/05/31 16:31:11 INFO mapred.FileInputFormat: Total input paths to process : 2
15/05/31 16:31:11 INFO streaming.StreamJob: getLocalDirs(): [/tmp/hadoop-xuguoqiang/mapred/local]
15/05/31 16:31:11 INFO streaming.StreamJob: Running job: job_201505311232_0018
15/05/31 16:31:11 INFO streaming.StreamJob: To kill this job, run:
15/05/31 16:31:11 INFO streaming.StreamJob: /Users/xuguoqiang/hadoop-1.2.1/libexec/../bin/hadoop job -Dmapred.job.tracker=hdfs://localhost:9001 -kill job_201505311232_0018
15/05/31 16:31:11 INFO streaming.StreamJob: Tracking URL: http://localhost:50030/jobdetails.jsp?jobid=job_201505311232_0018
15/05/31 16:31:12 INFO streaming.StreamJob: map 0% reduce 0%
15/05/31 16:31:16 INFO streaming.StreamJob: map 67% reduce 0%
15/05/31 16:31:19 INFO streaming.StreamJob: map 100% reduce 0%
15/05/31 16:31:25 INFO streaming.StreamJob: map 100% reduce 33%
15/05/31 16:31:26 INFO streaming.StreamJob: map 100% reduce 100%
15/05/31 16:31:27 INFO streaming.StreamJob: Job complete: job_201505311232_0018
15/05/31 16:31:27 INFO streaming.StreamJob: Output: output
刚开始学习hadoop,加油!坚持!希望同道的人能给出建议。
参考:
粉丝日志:http://blog.fens.me/hadoop-mapreduce-matrix/
python版 mapreduce 矩阵相乘的更多相关文章
- MapReduce 矩阵相乘
对于矩阵A[mn]*B[nl]=C[ml].这里可以并行起来的就是每个Cij,对于Cij而言,他是由A的第i行和B的第j列相乘得到.由于大的矩阵中经常是稀疏矩阵,所以一般用行列值表示 例如对于A: 1 ...
- python版mapreduce题目实现寻找共同好友
看到一篇不知道是好好玩还是好玩玩童鞋的博客,发现一道好玩的mapreduce题目,地址http://www.cnblogs.com/songhaowan/p/7239578.html 如图 由于自己太 ...
- Python+MapReduce实现矩阵相乘
算法原理 map阶段 在map阶段,需要做的是进行数据准备.把来自矩阵A的元素aij,标识成p条<key, value>的形式,key="i,k",(其中k=1,2,. ...
- 稀疏矩阵相乘-Python版
稀疏矩阵相乘-Python版 Given two sparse matrices A and B, return the r ...
- MapReduce实现矩阵相乘
矩阵相乘能够查看百度百科的解释http://baike.baidu.com/view/2455255.htm?fr=aladdin 有a和b两个矩阵 a: 1 2 ...
- MapReduce的矩阵相乘
一.单个mapreduce的实现 转自:http://blog.sina.com.cn/s/blog_62186b460101ai1x.html 王斌_ICTIR老师的<大数据:互联网大规模数据 ...
- 利用Hadoop实现超大矩阵相乘之我见(二)
前文 在<利用Hadoop实现超大矩阵相乘之我见(一)>中我们所介绍的方法有着“计算过程中文件占用存储空间大”这个缺陷,本文中我们着重解决这个问题. 矩阵相乘计算思想 传统的矩阵相乘方法为 ...
- 利用Hadoop实现超大矩阵相乘之我见(一)
前记 最近,公司一位挺优秀的总务离职,欢送宴上,她对我说“你是一位挺优秀的程序员”,刚说完,立马道歉说“对不起,我说你是程序员是不是侮辱你了?”我挺诧异,程序员现在是很低端,很被人瞧不起的工作吗?或许 ...
- Python numpy中矩阵的用法总结
关于Python Numpy库基础知识请参考博文:https://www.cnblogs.com/wj-1314/p/9722794.html Python矩阵的基本用法 mat()函数将目标数据的类 ...
随机推荐
- 手把手JDK环境变量配置
分为下载,配置,验证三个步骤解释如何进行JDK环境变量配置. 步骤一: 首先查看配置成功后的效果: tip:点击win——>运行(或者使用win+r,或者shift+鼠标右键打开powershe ...
- 微信小程序中显示与隐藏(hidden)
1.wx.wxml页面部分 <view bindtap='click'>点击</view> //这是显示隐藏的部分 <view hidden="{{hidden ...
- mui 事件管理及自定义事件详解
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- shop_z 一套非常适合二次开发的php后台管理系统
QQ群:247823727 如果你需要定制某些功能开联系群主,价格实惠,后期交接完善,有上手培训 shop_z基础thinkphp5 php7上开发运行,速度杠杠的 地址:https://gitee ...
- Jenkins+Jmeter持续集成笔记(一:环境准备)
整体思路: 通过Jmeter图形界面编写api测试脚本 ant 批量执行Jmeter脚本文件 将其集成到jenkins,设置执行频率与发送测试报告 运行环境 系统 配置 IP Centos7.1 1核 ...
- outlook2016用Exchange轻松绑定腾讯企业邮箱
系统版本:Win10 X64 1709 英文版 邮箱:Outlook2016 背景知识: 1.发送邮件均使用SMTP协议(SMTP 全称“Simple Mail Transfer Protocol”, ...
- jQuery-form实现文件分步上传
分步上传:当你需要提交两个及以上的文件,在一个文件成功后再提交另一个文件,并且最后需要提交所有文件的地址组成的数据 HTML: <form id="uploadVideoForm&qu ...
- visual studio code常用插件
1.auto close tag2.chinese language pack for visual studio code3.debugger for chrome4.docker5.html cs ...
- 让hive的表注释和字段注释支持中文
此处用的数据库类型为mysql.发现hive在初始化创建这些表的时候,大部分字段的字符集给设置成了latin1,然后collation设成了latin1_bin. 但是我们在hive中创建表时,表注释 ...
- Python记录13:软件开发目录规范
软件开发目录规范 开发一个软件,一个工程项目,一般应该具备以下的几个基本的文件夹和模块,当然,这并不是一成不变的,根据项目的不同会有一定的差异,不过作为一个入门级的新手,建议暂时按照以下的规范编写: ...