分享

使用 Hadoop 和 Mahout 实现推荐引擎

本帖最后由 xuanxufeng 于 2014-1-12 02:40 编辑

作为我之前博客的延续,在这篇博客中,我将探讨如何使用 MahoutHadoop 实现一个 推荐引擎

  • 第一部分 介绍 MapReduce为什么为了利用并行计算的优势,一些算法需要而重写
  • 第二部分 我会探讨 利用Hadoop的优势 推荐算法 在 Mahout 中如何推演
  • 第三部分 我会用 使用案例 来展示 如何在Hadoop和Mahout中实现 MapReduce 推荐引擎
利用并行计算的优势,一个基础要点是,集群中的计算机可以在不依赖于和其他计算机共享数据的情况下进行同一个任务。考虑排序算法情况下,他们并不是设计用于如下场景:我们将大块数据集拆分,然后递交给许多并行计算的计算机,当数据返回的时候,将大块数据集组装,得出结果。如果我们需要做排序,我们需要写一个利用MapReduce优点的算法。Terasort 算法是一个高度利用MapReduce优势的排序技术。

推荐引擎十分相似,如果我们需要利用MapReduce的优点,我们需要重写它。Mashout支持推荐算法。推荐引擎包含如下组件:
  • 基于用户/项目的推荐系统
  • 相似性(近邻概念)
在推荐引擎里面,相当于“Hello world”的程序就是Netflix电影评分。电影数据可以在这里下下载。测试数据包含用户租借电影的历史数据和用户对电影的评分数据。当你需要租借一部新的电影,推荐引擎会基于你的租借习惯,还有其他跟你相似的用户的租借记录,给你推荐一些电影。测试数据保存在事务型数据库里面,就如MySQL。我们可以写一个程序读取测试数据并把它导入Hadoop的文件系统里面。当你运行Mashout MapReduce,就会得到前“n”个推荐电影。如果你细心观察测试数据,你会发现有userid, itemid, rating字段,并以逗号隔开。它会假设,你在数据库中维护着用户和项目的数据表,并且通过这两个表的结合,给用户提供有意义的信息。
下面,我们一起看看基于项目的推荐算法是如何通过MapReduce实现的,想获得更多这方面的信息,可以查阅Mahout in Actionby Manning, chapter 6.

推荐系统相关
  • 第一步,利用上面的数据建立一个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表把推荐结果返回给你的用户了。


没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条