zoukankan      html  css  js  c++  java
  • Mahout踩坑之路

    一、版本对比

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

  • 相关阅读:
    Properties读取资源文件的四种方法
    如何成为一个C++高级程序员
    Linux定时任务设定
    Mysql之复制选项与监控
    GTID复制之二
    Mysql之多源复制
    MysqlDumpslow
    用Mysqlbinlog备份BinLog文件
    Mysql之mysqlbinlog使用
    Mysql之取消主从复制
  • 原文地址:https://www.cnblogs.com/ftyblog/p/3727484.html
Copyright © 2011-2022 走看看