MapReduce 可以用来解决许多问题。
谷歌、雅虎、 Facebook 和许多其他组织正在使用 MapReduce 进行各种各样的用例,包括分布式排序、 Web 链接图遍历、日志文件统计、文档集群和机器学习。此外,通常应用 MapReduce 的用例种类也在不断增加。
Apache Mahout 是一个开源项目,旨在通过在 Hadoop 基础设施中利用 MapReduce 构建一套完整的可伸缩的机器学习和数据挖掘库。我将介绍这个项目,并在本文中介绍这个项目中的几个例子。报道 Mahout 的动机是为了启动您进一步探索 MapReduce 的任务。我希望这个灵感能够帮助您有效地将 MapReduce 应用到您的特定和独特的用例中。
首先,到 mahout.apache.org 下载最新版本或源代码发行版。该项目不断发展并快速添加特性,因此抓住源代码分发来构建它是有意义的。除了 JDK 之外,您需要的惟一工具是一个 SVN 客户机来下载源代码,以及 Maven 3.0.2或更高版本来构建和安装它。
获取源代码如下:
Svn co http://svn.apache.org/repos/asf/mahout/trunk
然后切换到下载的“trunk”源目录,运行以下命令来编译和安装 Apache Mahout:
mvn compile
mvn install
您可能还希望获得如下 Mahout 示例:
cd examples
mvn compile
Mahout 附带了一个 Taste-web 推荐示例应用程序。您可以切换到 aste-web 目录并运行 mvn 包来编译和运行应用程序。
虽然 Mahout 是一个新项目,但它包含了集群、分类、协同过滤和进化编程的实现。
Mahout 包含一个名为 Taste 的推荐引擎库。此库可用于快速构建具有基于用户和基于项的推荐的系统。
Taste 有五个主要部分,即:
- DataModel-用于存储用户、项目和首选项的模型抽象。
- UserSimilarity-用于定义1个用户之间的相似性的接口。
- ItemSimilarity-定义两个项目之间相似性的接口
- Recommender-推荐程序实现的接口。
- UserNeighborhood-推荐系统使用邻域来表示用户相似性
您可以构建一个推荐系统,该系统利用 Hadoop 在大型数据集上运行批处理计算,并支持高度可伸缩的机器学习系统。
让我们参考一下用户对一组项目的评分,这些项目位于一个名为 ratings.csv 的简单文件中。这个文件的每一行都有 user_id、 item_id 和 ratings。
Mahout 有一组丰富的模型类来映射这个数据集。您可以按如下方式使用 FileDataModel:
FileDataModel dataModel = new FileDataModel (new File (ratings.csv)) ;
接下来,您需要确定一个距离度量,以查看两个不同的用户评级有多么相似。欧几里得度量是这类测量中最简单的,皮尔逊相关性也许是一个很好的标准化测量,在许多情况下都有效。要使用 Pearson 关联,可以配置相应的相似度类如下:
UserSimilarity usersimilarity=new PearsonCorrelationSimilarity(dataModel);
接下来,您需要定义一个用户邻居和一个推荐,并将它们结合起来生成推荐。守则可以如下:
//Get a neighborhood of users
UserNeighborhood neighborhood=
new NearestNUserNeighborhood(neighborhoodsize, userSimilarity, dataMode1);
//create the recommender
Recommender recommender =
new GenericUserBasedRecommender (dataModel, neighborhood, userSimilarity); User user = dataModel.getUser(userId);
System.out.println("User:"+ user);
//Print out the users own preferences first
TasteUtils.printPreferences(user, handler.map);
//Get the top 5 recommendations
List<RecommendedItem> recommendations =
recommender.recommend(userId, 5);
TasteUtils.printRecs(recommendations, handler.map);
这是一个简单的推荐系统启动和运行所需要的全部内容。
前面的示例没有明确使用 MapReduce,而是使用了基于协作过滤的推荐系统的语义。Mahout 使用 MapReduce 完成工作,并利用 Hadoop 基础设施计算大型分布式数据集中的推荐评分,但是大多数底层基础设施都是抽象出来的。
本文正在参加「金石计划 . 瓜分6万现金大奖」