一、版本对比

公司版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数。

Mahout踩坑之路的更多相关文章

  1. html2canvas的踩坑之路

    html2canvas的踩坑之路 前言 早有耳闻这个html2canvas比较坑,但无奈于产品需求的压迫,必须实现html转图片的功能,自此走上了填坑之路,好在最后的效果还算令人满意,这才没有误了产品 ...

  2. MySQL Connector/NET 使用小结(踩坑之路)

    背景描述 根据项目的需要,需连接MySQL获取数据. 首先,先了解一下项目的情况: 之前的代码是C#编写的的, 运行时:.NETFramework3.5. 由于项目已经部署上线,因此不能升级运行时,这 ...

  3. Android 上传开源项目到 jcenter 实战踩坑之路

    本文微信公众号「AndroidTraveler」首发. 背景 其实 Android 上传开源项目到 jcenter 并不是一件新鲜事,网上也有很多文章. 包括我本人在将开源项目上传到 jcenter ...

  4. Java踩坑之路

    陆陆续续学Java也快一年多了,从开始的一窍不通到现在的初窥门径,我努力过,迷茫过,痛过,乐过,反思过,沉淀过.趁着新年,我希望能把这些东西记下来,就当是我一路走来的脚印. 一.初识网站应用 记得第一 ...

  5. Android SDK 开发——发布使用踩坑之路

    前言 在 Android 开发过程中,有些功能是通用的,或者是多个业务方都需要使用的. 为了统一功能逻辑及避免重复开发,因此将该功能开发成一个 SDK 是相当有必要的. 背景 刚好最近自己遇到了类似需 ...

  6. jQuery升级踩坑之路

    1.使用了被废弃的jQuery.browser属性 jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support . 在更 ...

  7. webpack踩坑之路——构建基本的React+ES6项目

    转自:http://www.cnblogs.com/ghost-xyx/p/5483464.html webpack是最近比较火的构建工具,搭配上同样比较火的ReacJS与ES6(ES2015)一定是 ...

  8. webpack踩坑之路——图片的路径与打包

    转自:http://www.cnblogs.com/ghost-xyx/p/5812902.html 刚开始用webpack的同学很容易掉进图片打包这个坑里,比如打包出来的图片地址不对或者有的图片并不 ...

  9. 踩坑之路_"var name = ' ';"_迷之BUG

    情景介绍:最近写一个拖拽生成图表的工具,自己的思路每次mousedown的时候动态将this的name属性值赋值给全局中变量(自己手贱测试时直接将变量名命名为了'name',一大波bug还有30s到达 ...

随机推荐

  1. Linux shell 脚本小记

    if结构 #!/bin/env bash -gt ] then echo "$1 is positive" -lt ] then echo "$1 is negative ...

  2. js call apply bind简单的理解

    相同点:JS中call与apply方法可以改变某个函数执行的上下文环境,也就是可以改变函数内this的指向.区别:call与apply方法的参数中,第一个参数都是指定的上下文环境或者指定的对象,而ca ...

  3. 130701基础练习-first

    // 629.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h"//#include <iostream.h> class Point ...

  4. 李洪强iOS开发之 - 实现九宫格并使用SDWebImage下载图片

     李洪强iOS开发之 - 实现九宫格并使用SDWebImage下载图片  源码:  // //  ViewController.m //  08-九宫格扩展 // //  Created by 李洪强 ...

  5. Rebound-Android的弹簧动画库

    Rebound是facebook出品的一个弹簧动画库,与之对应的IOS版本有一个pop动画库,也是非常的强大给力.Facebook真是互联网企业中的楷模,开源了很多的实用开源库,大赞一个!!! 讲解R ...

  6. Xaml语法概述及属性介绍

    Xaml语法概述 1.命名空间     xmal每个元素都对应着一个类,但是在xmal中,只提供类名是不够的,需要知道该类实在.net的哪个命名空间下面.Xaml解析器才能够正确的解析. 1 < ...

  7. Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试

    环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...

  8. 78. Subsets

    题目: Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset mus ...

  9. python脚本实例001 - 通过列表内容判断输入输出信息

    要点总结: 输入输出方法,input().print()方法 list列表应用,list是一种有序的集合,可以随时添加和删除其中的元素. 条件语句if-else应用 #! /usr/bin/pytho ...

  10. centos防火墙设置

    1.查看 service iptables status 2.开关 service iptables start/stop 3.开机启动 chkconfig iptables on/off 4.编辑端 ...