一、版本对比
- 由于Mahout只能允许于hadoop0.20以上版本上,而百度的hadoop是hadoop0.19的一个分支。因此百度HPC组曾经将Mahout移植到百度的hadoop集群。
- Mahout上古版本,只有itembased一种算法,且只能用于百度版hadoop。
- 运行于开源hadoop集群。
- 建议Mahout0.8版本,支持多种算法。
二、安装、使用
1. 下载开源mahout
http://archive.apache.org/dist/mahout/
推荐用mahout 0.8版本
2. 配置
解压缩后编辑mahout-distribution-0.8/bin/mahout文件
HADOOP_CONF_DIR='/home/work/hadoop-opensource/conf
HADOOP_HOME='/home/work/hadoop-opensource'
3. 运行命令
sh mahout-distribution-0.8/bin/mahout
返回结果是参数说明,按照你的需求配置参数即可。
示例代码
三、踩过的坑
1. id只支持[0, 2^32-1]的正整数
mahout的输入userid、itemid是long型的,但内部会将id转成int型。所以只支持的32位无符号int的范围,即取值范围[0, 2^32-1]的数。
所以如果id类型是baiduid、cuid、url的话,需要先将id做32位签名。
2. OutOfMemoryError 内存不足错误
原因是:mahout在计算协同矩阵前有一轮job countObservations,它使用一个reduce统计用户数量,而且是用HashMap存储,导致数据量稍大,内存就超限。
但是在后续的计算中countObservations数据并没有使用到,这是一轮无用且导致致命错误的任务。
解决办法是使用mahout0.8,此坑只在mahout0.9中出现。
3. 另一种OutOfMemoryError 内存不足错误
即使在mahout0.8,也存在一些使用内存存储hashmap的情况,导致数据量大时oom
recommenditembased和itemsimilarity的第四轮job normsAndTranspose,map阶段分别用hashmap存储了每个item的norm、nonZeroEntries(非0评分用户数)、maxValues(最大pref)。
输入数据200G,item数3500万,oom。
解决办法只能是调大内存、调大map数。