mahout算法源码分析之Collaborative Filtering with ALS-WR 并行思路
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 并行思路的更多相关文章
- mahout算法源码分析之Collaborative Filtering with ALS-WR (四)评价和推荐
Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 首先来总结一下 mahout算法源码分析之Collaborative Filtering with AL ...
- mahout算法源码分析之Collaborative Filtering with ALS-WR拓展篇
Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 额,好吧,心头的一块石头总算是放下了.关于Collaborative Filtering with AL ...
- mahout算法源码分析之Itembased Collaborative Filtering(二)RowSimilarityJob
Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 本篇开始之前先来验证前篇blog的分析结果,编写下面的测试文件来进行对上篇三个job的输出进行读取: p ...
- mahout算法源码分析之Itembased Collaborative Filtering(四)共生矩阵乘法
Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 经过了SimilarityJob的计算共生矩阵后,就可以开始下面一个过程了,这个过程主要是共生矩阵的乘法 ...
- mahout算法源码分析之Itembased Collaborative Filtering(三)RowSimilarityJob验证
Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 本篇分析上篇的分析是否正确,主要是编写上篇输出文件的读取以及添加log信息打印相关变量. 首先,编写下面 ...
- diff.js 列表对比算法 源码分析
diff.js列表对比算法 源码分析 npm上的代码可以查看 (https://www.npmjs.com/package/list-diff2) 源码如下: /** * * @param {Arra ...
- OpenCV人脸识别Eigen算法源码分析
1 理论基础 学习Eigen人脸识别算法需要了解一下它用到的几个理论基础,现总结如下: 1.1 协方差矩阵 首先需要了解一下公式: 共公式可以看出:均值描述的是样本集合的平均值,而标准差描述的则是样本 ...
- 朴素贝叶斯算法源码分析及代码实战【python sklearn/spark ML】
一.简介 贝叶斯定理是关于随机事件A和事件B的条件概率的一个定理.通常在事件A发生的前提下事件B发生的概率,与在事件B发生的前提下事件A发生的概率是不一致的.然而,这两者之间有确定的关系,贝叶斯定理就 ...
- OpenCV人脸识别LBPH算法源码分析
1 背景及理论基础 人脸识别是指将一个需要识别的人脸和人脸库中的某个人脸对应起来(类似于指纹识别),目的是完成识别功能,该术语需要和人脸检测进行区分,人脸检测是在一张图片中把人脸定位出来,完成的是搜寻 ...
随机推荐
- ASP.NET动态引用WebService接口
尊重原著作:本文转载自http://www.mhzg.net/a/20124/20124912180589.html 有经验的朋友都知道,通常我们在引用webservice的时候,是在项目中就添加了引 ...
- 内存管理——Cocos2d-x学习历程(五)
Cocos2d-x采用了引用计数与自动回收的内存管理机制. 1.每个对象包含一个用来控制生命周期的引用计数器,它就是CCObject的成员变量m_u- Reference.我们可以通过retainCo ...
- Qt 控件
一.布局管理器 QHBoxLayout 水平布局 QVBoxLayout 垂直布局 QGridLayout 格点布局 QFormLayout 关联布局 QSplitter 分裂器 Spacers 间隔 ...
- Java提高学习之Object(4)
哈希码 问: hashCode()方法是用来做什么的? 答: hashCode()方法返回给调用者此对象的哈希码(其值由一个hash函数计算得来).这个方法通常用在基于hash的集合类中,像java. ...
- jedis入门一
一.下载Jedis的依赖包jedis-2.1.0.jar,然后将其添加到classpath下面. 1. 定义连接:Redis暂时不要设置登录密码 Jedis jedis = new Jedis(&qu ...
- Attempted to lock an already-locked dir的解决方法
第一,在当前目录使用“清理”功能,如果不行,到上一级目录,再执行“清理”. 第二,如果看到某个包里面的文件夹没有SVN的标志,直接用“Ctrl+Delete”手工删除,然后“清理”.
- c/c++:内存泄露和野指针的概念
内存泄漏 用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元.直到程序结束.即所谓内存泄漏. 注意:内存泄漏是指堆内存的泄漏. 简单的说就是申请了一块内存空间,使用 ...
- 2.java.lang.NullPointerException(空指针异常)
调用了未经初始化的对象或者是不存在的对象 经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等.对数组操作中出现空指针, 即把数组的初始化和数组元素的初始化混淆起来 ...
- perl 升级到5.20版本
不建议先rm 先下载tar.gz ...然後手动安装..default 安装到/usr/local/目录下.. 然後修改/usr/bin/perl的symbolic link到/usr/local/b ...
- Openstack service default port
Block Storage (cinder) 8776 publicurl and adminurl Compute API (nova-api) 8773 EC2 API 8774 openstac ...