Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit。

mahout算法源码分析之Collaborative Filtering with ALS-WR 这个算法的并行主要就应该是ParallelALSFactorizationJob这里的并行了,下图是这个Job的大部分操作:

这里分析并行就是看每个job任务是否可以出现多个map或者reduce即可。

(1)首先分析前面三个itemRatings,对应的输入是原始文件,如果原始文件很大的话,那么这个任务可以建立多个mapper和reducer;这个是没有问题的;

(2)第二个userRatings,这个输入是前面itemRatings的输出,如果前面的输出太大的话,那么这个userRatings的输入mapper个数也可以多个;

(3)第三个averageRatings,这个输入同样是前面的itemRatings的输出,那么分析就和userRatings一样了,同样可以并行;

(4)其实最主要的就是这个for循环了,如果这个可以并行,那么就全部都可以并行了。看到这里的itemRatings输入,所以for循环里面的第二个job不用考虑是否可以并行了,肯定是可以了。那么第一个userRatings呢?当然如果userRatings输出数据很多的话,那么这个job同样是可以并行化的。所以当数据很大的时候就会产生多个mapper(默认64M一个mapper),那么就可以并行了。但是这里有个问题,就是当数据很大的时候,其中的U和M不会很大么,这两个是要放入内存的,太大的话肯定是会影响程序运行效率的。那么就拿movie数据来对比分析下:原始数据的trainingSet是9.92M,得到的itemRatings是8.67M,得到的userRatings是7.92M,得到的M矩阵是633K,得到的U矩阵是1.01M。所以对于U矩阵来说当原始数据比较大的时候,这个矩阵也是比较大的,放入内存中也不是很适合,同时这里的numFeature设置为20,如果这个参数设置为50的话,那么U和M就会更大,这个要是要考虑的。mahout官网上说这个算法由于含有循环,所以性能不够好。

其实这里还有一个比较简单的方法来测试for循环阶段建立多个mapper,建立下面的代码:

package mahout.fansy.als.test;

import mahout.fansy.als.ParallelALSFactorizationJobFollow;

public class TestParallelALSFactorizationJobFollow {

	/**
* 测试ParallelALSFactorizationJobFollow
* 看是否在for循环里面得到两个mapper?
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String[] arg=new String[]{"-jt","ubuntu:9001","-fs","ubuntu:9000",
"-i","hdfs://ubuntu:9000/test/input/user_item",
"-o","hdfs://ubuntu:9000/test2/output",
"--lambda","0.065","--numFeatures","3","--numIterations","3",
"--tempDir","hdfs://ubuntu:9000/test2/temp"
};
ParallelALSFactorizationJobFollow.main(arg);
} }

同时,把hadoop集群的hadoop-core-1.0.4.jar 更新下,使用 http://download.csdn.net/detail/fansy1990/6375301这里的类进行如下更新:


注意路径,这个自己新建即可。

然后直接运行上面的测试程序,就可以在50030界面看到两个mapper的job了,如下:

总体来说,这个算法的性能应该不如itembased collaborative filtering 算法,所以,下个mahout算法源码分析系列就分析 itembased collaborative filtering。

分享,成长,快乐

转载请注明blog地址:http://blog.csdn.net/fansy1990

mahout算法源码分析之Collaborative Filtering with ALS-WR 并行思路的更多相关文章

  1. mahout算法源码分析之Collaborative Filtering with ALS-WR (四)评价和推荐

    Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 首先来总结一下 mahout算法源码分析之Collaborative Filtering with AL ...

  2. mahout算法源码分析之Collaborative Filtering with ALS-WR拓展篇

    Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 额,好吧,心头的一块石头总算是放下了.关于Collaborative Filtering with AL ...

  3. mahout算法源码分析之Itembased Collaborative Filtering(二)RowSimilarityJob

    Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 本篇开始之前先来验证前篇blog的分析结果,编写下面的测试文件来进行对上篇三个job的输出进行读取: p ...

  4. mahout算法源码分析之Itembased Collaborative Filtering(四)共生矩阵乘法

    Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 经过了SimilarityJob的计算共生矩阵后,就可以开始下面一个过程了,这个过程主要是共生矩阵的乘法 ...

  5. mahout算法源码分析之Itembased Collaborative Filtering(三)RowSimilarityJob验证

    Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 本篇分析上篇的分析是否正确,主要是编写上篇输出文件的读取以及添加log信息打印相关变量. 首先,编写下面 ...

  6. diff.js 列表对比算法 源码分析

    diff.js列表对比算法 源码分析 npm上的代码可以查看 (https://www.npmjs.com/package/list-diff2) 源码如下: /** * * @param {Arra ...

  7. OpenCV人脸识别Eigen算法源码分析

    1 理论基础 学习Eigen人脸识别算法需要了解一下它用到的几个理论基础,现总结如下: 1.1 协方差矩阵 首先需要了解一下公式: 共公式可以看出:均值描述的是样本集合的平均值,而标准差描述的则是样本 ...

  8. 朴素贝叶斯算法源码分析及代码实战【python sklearn/spark ML】

    一.简介 贝叶斯定理是关于随机事件A和事件B的条件概率的一个定理.通常在事件A发生的前提下事件B发生的概率,与在事件B发生的前提下事件A发生的概率是不一致的.然而,这两者之间有确定的关系,贝叶斯定理就 ...

  9. OpenCV人脸识别LBPH算法源码分析

    1 背景及理论基础 人脸识别是指将一个需要识别的人脸和人脸库中的某个人脸对应起来(类似于指纹识别),目的是完成识别功能,该术语需要和人脸检测进行区分,人脸检测是在一张图片中把人脸定位出来,完成的是搜寻 ...

随机推荐

  1. BaseAdapter 注意的关键点!

    BaseAdapter  我们一般就是继承然后重写自定义,然后listview  set进去即可!  数据改变的时候,我们习惯这样: public void update(List list) {   ...

  2. 为何与0xff进行与运算

    为何与0xff进行与运算 在剖析该问题前请看如下代码 public static String bytes2HexString(byte[] b) { String ret = "" ...

  3. jQuery源码笔记——回调对象

    回调对象是一个多用途的回调列表对象,提供了强大的的方式来管理回调函数列表. 最简单的缓存对象 function Callbacks(){ var list = [], self = { add: fu ...

  4. 说说VS 2015 RC最新开发工具的体验

    有两个我感觉是提高效率的地方: 1.智能提示的改进,鼠标只要移动到代码上面的类型.字段,就会显示相应的提示,这大大提高我们开发时候需要按F12才能看到定义的内容.下面上图,给大家形象化: 2.管理Nu ...

  5. CSS Unicode 编码

    CSS 中文字体 Unicode 编码表 在 CSS 中设置字体名称,直接写中文是可以的.但是在文件编码(GB2312.UTF-8 等)不匹配时会产生乱码的错误. 为此,在 CSS 直接使用 Unic ...

  6. 使用关联对象(AssociatedObject)为UIButton添加Block响应

    在开发中,要给UIButton添加点击事件的话,通常的做法是这样的 UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; [ ...

  7. Ubuntu引导修复问题

    Ubuntu和Win7双系统,一不小心在Ubuntu下把Win7 C盘的boot目录给删了(手贱呀),然后Win7就没了,后来找了张WinPE启动盘修复了Win7引导结果,Ubuntu系统的引导没了. ...

  8. JAVA 堆设置

    JAVA 堆设置 第四节 堆已经讲得差不多啦,这章我们以一个例子来说说如何设置以及当发生堆溢出的时候怎么排查问题.先看一小段代码:         代码中使用了一个无限循环来为list添加对象,如果采 ...

  9. U3D学习使用笔记(三)

    1.对动画进行播放和暂停(从初始位置) (1).老版动画系统Animation 暂停 an["Take 001"].time = 0f; an["Take 001&quo ...

  10. 提示constructor无法location的原因

    1.缺少对应属性的set方法 2.缺少确实没有对应的方法 3.对应的构造方法中参数类型不匹配 4.java对象不会在寻找构造函数时执行数据类型的强制类型转换,没有对应的类型就返回异常,不会自动强制转换 ...