最近在做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. Java获取http和https网址对应html数据实例

    由于之前在公司一直用的C#做的软件开发,近些天有同学需要用Java做一个从指定网址获取信息的Java程序.正好不是很难,顺便复习了一下Java的知识. 要求如下,在https://www.marine ...

  2. 为什么要使用Entity Framework

    本文介绍从DDD(Domain-Driven Design[领域驱动设计])的角度来说说为什么要使用Entity Framework(以下都会简称为EF),同时也看出类似Drapper之类的简陋ORM ...

  3. WCF接口实例介绍

    Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. WCF整合了原有的windows通讯 ...

  4. C语言实现windows进程遍历

    #include <windows.h> #include <tlhelp32.h> //进程快照函数头文件 #include <stdio.h> int main ...

  5. SVM的代码实现-python

    隔了好久木有更新了,因为发现自己numpy的很多操作都忘记了,加上最近有点忙... 接着上次 我们得到的迭代函数为 首先j != yi j = yi import numpy as np def sv ...

  6. 用.NET WebService Studio调试Web Service解决SOAPAction的问题

    话说是这样的,这两天开发一个短信发送功能,客户给了一个 Web Service 地址(没有文档),让我调用就可以发送了, 我在VS 2013添加了服务引用,一切正常,可是执行代理方法时,怎么都报错 R ...

  7. SSH 学习笔记

    零.背景 在看 pm2 的 deploy 功能的时候,对 ssh 的不熟悉导致错误频出,包括之前对 github 的配置也用到了 SSH,所以找个机会整理一下. 一.介绍 SSH 是每一台 Linux ...

  8. 记录jquery的ajax

    1.直接干货 ajax很简单jquery有很好的支持,原生js就不写了.总的说常用的有3个方法 $.post $.get $.ajax 具体参数参考教程http://www.runoob.com/jq ...

  9. 【sping揭秘】13、Spring AOP一世&二世

    Spring AOP一世 Spring AOP中的advice Before advice 这个就是在方法执行之前执行,也就是在对应的joinpoint之前 spring AOP二世 开启aspect ...

  10. Centos Android开发环境配置-Android Tools -android list sdk --extended --all

    Centos Android开发环境配置-Android Tools -android  list sdk --extended --all 安装完Android Tools后执行 android   ...