MapReduce编程: 2. 矩阵乘法
题目
使用MapReduce编程实现矩阵乘法
分析
- 矩阵的存储方式,有两种,采用原始表示方式,就是矩阵是什么样子,就保存成什么样子,比如
还有一种,就是以稀疏矩阵存储,仅存储非零值,比如
两种存储方式各有所长,我们就采用第二种存储方式
- 在矩阵乘法运算时,是用左矩阵A的第i行的元素 分别乘以 右矩阵B的第j列的各个元素,然后结果相加,从而得到结果矩阵C的第i行第j列的元素,所以可以得到这样一个规律:Aij,会用在Cim,m=1,2,3,…,j;同理,Bij,会用在Cnj,n=1,2,3,…,i
- 对于map,要做的就是将原始的两个矩阵上的各个数,会参与结果矩阵的哪一个位置的运算找出来,所以输入依旧是原始文本,输出是一个键值对,键是该元素会参与运算的位置,是一个行列坐标,值则是该元素的标志,a代表左矩阵,b代表右矩阵,同时保存该元素的位置和值,打个比方,在左矩阵第三行第二列的元素9,它的存储为 3 2 9,假设它会参与到C31和C32的运算,所以经过map,输出为 <(3,1),(a,2,9)>和<(3,2),(a,2,9)>,而如果是右矩阵第三行第二列的元素9,存储还是 3 2 9,那么它会参与到C12和C22的运算,经过map,输出为 <(1,2),(b,3,9)>和<(2,2),(b,3,9)>,说的我自己都晕了,后面放张图去理解吧
- 对于reduce,要做的就是将shuffle的结果,进行合并,计算结果,所以输入就是map的输出,输出就是结果矩阵
- 根据map和reduce的输入输出,键值对都是好几个数字的组合,所以可以使用Text类
- 对于上篇博客没玩透的combiner,我当然又会继续作死的玩,但是还是好多坑,在后面说吧
上篇博客:https://blog.youkuaiyun.com/Dongroot/article/details/88571680
准备工作
- ubuntu14环境
- 启动的hadoop
- 安装好hadoop插件的eclipse
- 存放两个矩阵的文档
(以下操作都是在ubuntu下进行)对于前三个环境,应该在上篇博客之前就已经弄好了,就不说了,只要准备两个文档就OK了,在桌面新建两个txt文档,按照上面介绍的第二种存储方式,写上两个矩阵,比如
这里我是采用两个文本,然后