Mahout踩坑之路

时间:2022-11-01 15:54:32

一、版本对比

公司版Mahout

  • 由于Mahout只能允许于hadoop0.20以上版本上,而百度的hadoop是hadoop0.19的一个分支。因此百度HPC组曾经将Mahout移植到百度的hadoop集群。
  • Mahout上古版本,只有itembased一种算法,且只能用于百度版hadoop。

开源Mahout

  • 运行于开源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

返回结果是参数说明,按照你的需求配置参数即可。

示例代码

date=$1
cd /home/work/mahout/mahout-distribution-0.8
sh bin/mahout hadoop fs -rmr /user/rp-rd/yitengfei/site-rec/cf/$1/temp/
sh bin/mahout recommenditembased \
-Dmapred.map.tasks=700 \
-Dmapred.reduce.tasks=700 \
-Dmapred.map.capacity=700 \
-Dmapred.reduce.capacity=700 \
-Dmapred.child.java.opts=-Xms4096m \
-Dmapred.reduce.child.java.opts=-Xms4096m \
--input /user/rp-rd/yitengfei/site-rec/data_item_id/$1 \
--output /user/rp-rd/yitengfei/site-rec/cf/$1/output \
--tempDir /user/rp-rd/yitengfei/site-rec/cf/$1/temp \
--similarityClassname SIMILARITY_COOCCURRENCE \
--numRecommendations 100
exit 0

三、踩过的坑

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数。