最近在做mahout源码调用的时候,发现一个参数:startPhase和endPhase,这两个参数是什么意思呢?比如运行RecommenderJob时,可以看到10个MR任务,所以猜测是否是一个phase代表一个MR?

带着这样的疑问进行了实验:

$Hadoop_HOME/bin/hadoop jar mahout-0.7/core/target/mahout-core-0.7-job.jar org.apache.mahout.cf.taste.hadoop.item.RecommenderJob --input input/intro.csv --output date1129/cf00 --tempDir date1129/cftemp00 --booleanData false --similarityClassname SIMILARITY_COOCCURRENCE --startPhase 0 --endPhase 4

但是,实验结果却还是那样,仍然运行了10个MR,然后就去google了,网上看到这个一个观点:The first MR job is index 0.  So setting –startPhase 1 will execute the 2nd 
job onwards.  Putting in –endPhase 2 would stop after the 3rd job. ,来自http://lucene.472066.n3.nabble.com/RowSimilarity-startphase-and-endphase-parameters-td2119682.html。这个的意思其实就是说MR job 和phase是同一个意思,但是我实验后却证明不是这样;

而且网上这个话题比较少涉及到,没办法只能看源码了。

看 mahout的源码可以看到基本的算法Job都继承来AbstractJob这个类,而AbstractJob这个类里面有一个 shouldRunNextPhase方法,这个方法是和startPhase和endPhase这两个参数有关的,所以如果 RecommenderJob里面有这个方法的话,那么应该就可以说startPhase和endPhase两个参数是有作用的;

我没有继 续分析源码了,下面说下我的做法:我在AbstractJob这个类的shouldRunNextPhase里面加入了打印currentPhase和 startPhase,endPhase以及这个方法返回的boolean值,不过这个如果在终端运行(也就是上面提及的在命令行运行)的话,是看不到打 印的内容的。同时也可以不打印,而是选择用log,写入log,不过这个要去slave节点机才能看到,比较麻烦,所以就没有使用Log.

如 何才能打印出结果呢?使用mvn编译mahout的源代码(修改过的),然后在$MAHOUT_SOUCE/core/targe里面有mahout- core-0.7-job.jar文件,把这个文件拷贝到eclipse,然后直接编写代码调用这个jar文件里面的RecommenderJob类就可 以在Console里面看到我们打印的信息了,这样就可以看出来MR Job和phase的区别了。

那么,phase的意义到底是什么呢?其实pahse的含义就是几个MR的一个集合,不定数目的MR job视为一个phase。这个有什么好处呢?比如你运行RecommenderJob时前面的两个phase都运行成功了,但是后面的运行出错,那么是 否要继续从第一个phase开始运行呢,其实完全没有必要,可以设置startPhase和endPhase这两个参数,直接跳过前面两个Phase。

那么回到最开始的问题,为什么我设置了那两个参数,但是却没有作用呢?因为RecommenderJob只有四个phase,而我设置0-4超过了最大值3,所以所有的MR job仍照常运行。

推荐系统相关

  • 第一步,利用上面的数据建立一个co-occurrence矩阵。矩阵主要作用是告诉我们2个项目同时被用户购买的发生次数。它基本上是一个以n×n的方形矩阵(n是用户购买的所有项目的总数)。
  • 下一步,计算用户购买了哪些项目的向量,以单列矩阵实现。
  • 最后一步,把第一步生成的co-occurrence矩阵与用户向量相乘得到推荐数据。我们把最大非零值的项目推荐给用户。

下面让我们来分析一下航班预订系统。当一个用户需要购买到达某地的机票的时候,我们就会基于他之前购买过的航班记录和其他相似乘客的订票记录,给他推荐航班。假设MySQL里面存在这样的数据,我们可以使用sqoop脚本把数据导入到HDFS:

1 sqoop import --connect jdbc:mysql://localhost/reservation --username krishna --password pass123  --table useritem

在Hadoop中运行以下mashout脚本

1 hadoop jar mahout-core-0.6-job.jar org.apache.mahout.cf.taste.hadoop.item.RecommenderJob -Dmapred.input.dir=input/input.txt -Dmapred.output.dir=output --usersFile input/users.txt --booleanData --similarityClassname SIMILARITY_COOCCURRENCE

最后,运行sqoop脚本把分析结果导回到mysql中:

1 sqoop export --connect jdbc:mysql://localhost/reservation --username krishna --password pass123 --table useritem --export-dir useritem/part-m-00000
现在,我们就可以读取useritem表把推荐结果返回给你的用户了。

mahout 使用的更多相关文章

  1. [Mahout] 完整部署过程

    概述        Mahout底层依赖Hadoop,部署Mahout过程中最困难的就是Hadoop的部署      本文假设用户本身没有进行Hadoop的部署,记述部署Mahout的过程       ...

  2. Mahout之数据承载

    转载自:https://www.douban.com/note/204399134/ 推荐数据的处理是大规模的,在集群环境下一次要处理的数据可能是数GB,所以Mahout针对推荐数据进行了优化. Pr ...

  3. Mahout推荐算法API详解

    转载自:http://blog.fens.me/mahout-recommendation-api/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, ...

  4. 从源代码剖析Mahout推荐引擎

    转载自:http://blog.fens.me/mahout-recommend-engine/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pi ...

  5. mahout 安装测试

    1 下载 在http://archive.apache.org/dist/mahout下载相应版本的mahout 版本,获取官网查看http://mahout.apache.org 相关的信息

  6. Hadoop里的数据挖掘应用-Mahout——学习笔记<三>

    之前有幸在MOOC学院抽中小象学院hadoop体验课. 这是小象学院hadoop2.X的笔记 由于平时对数据挖掘做的比较多,所以优先看Mahout方向视频. Mahout有很好的扩展性与容错性(基于H ...

  7. 初学Mahout测试kmeans算法

    预备工作: 启动hadoop集群 准备数据 Synthetic_control.data数据集下载地址http://archive.ics.uci.edu/ml/databases/synthetic ...

  8. Mahout安装与配置

    一.安装mahout 1.下载mahout(mahout-distribution-0.9.tar.gz) http://pan.baidu.com/s/1kUtOMQb 2.解压至指定目录 我平时都 ...

  9. Mahout 的安装

    Mahout 的安装 Mahout是Hadoop的一种高级应用.运行Mahout需要提前安装好Hadoop,Mahout只在Hadoop集群的NameNode节点上安装一个即可,其他数据节点上不需要安 ...

  10. Mahout源码分析之 -- 文档向量化TF-IDF

    fesh个人实践,欢迎经验交流!Blog地址:http://www.cnblogs.com/fesh/p/3775429.html Mahout之SparseVectorsFromSequenceFi ...

随机推荐

  1. 转MySQL遇到的语法差异及解决方案

    最近公司项目需要从SQL Server转到MySQL, 在转的过程中遇到两者语法之间的一些差异,在网上找了解决方案后,特记录在此.由于解决方案可能有很多种,我只记录了自己使用过的,仅作参考. 1. 拼 ...

  2. AEAI DP开发统计分析

    1 背景概述 平时做统计分析都是调rest服务,给前台提供数据,然后在管理控制台里配置portlet.但并不是所有的项目都会用到portal,这时就需要在AEAI DP应用开发平台里开发统计分析了,下 ...

  3. MariaDB 备份与日志管理(13)

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...

  4. 关于SQL的常用操作(增、删、改、查)

    关于SQL的常见操作主要是增.删.改.查. 1.增,顾名思义就是新增数据(insert into).该语句用于向表中插入新纪录.insert into有两种用法. (1).无需指定要插入数据的列名,只 ...

  5. redis集成相关工具类

    package cn.yiyuan.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; i ...

  6. Pycharm配置autopep8:自动调整代码为PEP8风格

    关于PEP 8 PEP 8,Style Guide for Python Code,是Python官方推出编码约定,主要是为了保证 Python 编码的风格一致,提高代码的可读性. 官网地址:http ...

  7. Python中对矩阵的洗牌操作

    [code] import numpy as np # 创建随机交换的索引 permutation = list(np.random.permutation(3)) # 创建矩阵X,Y X = np. ...

  8. ES使用org.elasticsearch.client.transport.NoNodeAvailableException: No node available 错误解决方法

    1) 端口错 client = new TransportClient().addTransportAddress(new InetSocketTransportAddress(ipAddress, ...

  9. idea自己用得到的命令

    1.注释 Ctrl + / 单行注释 . 取消注释 Ctrl + Shift + / 多行注释 .取消注释 2.查找 Ctrl + N 通过输入类名打开类(标准说法是查找类文件) Ctrl + Shi ...

  10. GO入门——3. 控制语句

    1 if 条件表达式没有括号 支持一个初始化表达式(可以是并行方式) 左大括号必须和条件语句或else在同一行 支持单行模式 初始化语句中的变量为block级别,同时隐藏外部同名变量 a := 1 i ...