前言

基于Hadoop的项目,不管是MapReduce开发,还是Mahout的开发都是在一个复杂的编程环境中开发。Java的环境问题,是困扰着每个程序员的噩梦。Java程序员,不仅要会写Java程序,还要会调linux,会配hadoop,启动hadoop,还要会自己运维。所以,新手想玩起Hadoop真不是件简单的事。

不过,我们可以尽可能的简化环境问题,让程序员只关注于写程序。特别是像算法程序员,把精力投入在算法设计上,要比花时间解决环境问题有价值的多。

目录

Maven介绍和安装

Mahout单机开发环境介绍

用Maven构建Mahout开发环境

用Mahout实现协同过滤userCF

用Mahout实现kmeans

模板项目上传github

1. Maven介绍和安装

开发环境

Win7 64bit

Java 1.6.0_45

Maven 3

Eclipse Juno Service Release 2

Mahout 0.6

这里要说明一下mahout的运行版本。

mahout-0.5, mahout-0.6, mahout-0.7,是基于hadoop-0.20.2x的。

mahout-0.8, mahout-0.9,是基于hadoop-1.1.x的。

mahout-0.7,有一次重大升级,去掉了多个算法的单机内存运行,并且了部分API不向前兼容。

注:本文关注于“用Maven构建Mahout的开发环境”,文中的 2个例子都是基于单机的内存实现,因此选择0.6版本。Mahout在Hadoop集群中运行会在下一篇文章介绍。

2. Mahout单机开发环境介绍

如上图所示,我们可以选择在win中开发,也可以在linux中开发,开发过程我们可以在本地环境进行调试,标配的工具都是Maven和Eclipse。

3. 用Maven构建Mahout开发环境

1. 用Maven创建一个标准化的Java项目

2. 导入项目到eclipse

3. 增加mahout依赖,修改pom.xml

4. 下载依赖

1). 用Maven创建一个标准化的Java项目

~ D:\workspace\java>mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes

-DgroupId=org.conan.mymahout -DartifactId=myMahout -DpackageName=org.conan.mymahout -Dversion=1.0-SNAPSHOT -DinteractiveMode=false

进入项目,执行mvn命令

~ D:\workspace\java>cd myMahout

~ D:\workspace\java\myMahout>mvn clean install

2). 导入项目到eclipse

我们创建好了一个基本的maven项目,然后导入到eclipse中。 这里我们最好已安装好了Maven的插件。

3). 增加mahout依赖,修改pom.xml

这里我使用hadoop-0.6版本,同时去掉对junit的依赖,修改文件:pom.xml

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

4.0.0

org.conan.mymahout

myMahout

jar

1.0-SNAPSHOT

myMahout

http://maven.apache.org

UTF-8

0.6

org.apache.mahout

mahout-core

${mahout.version}

org.apache.mahout

mahout-integration

${mahout.version}

org.mortbay.jetty

jetty

org.apache.cassandra

cassandra-all

me.prettyprint

hector-core

4). 下载依赖

~ mvn clean install

在eclipse中刷新项目:

项目的依赖程序,被自动加载的库路径下面。

4. 用Mahout实现协同过滤userCF

Mahout协同过滤UserCF深度算法剖析,请参考文章:用R解析Mahout用户推荐协同过滤算法(UserCF)

实现步骤:

1. 准备数据文件: item.csv

2. Java程序:UserCF.java

3. 运行程序

4. 推荐结果解读

1). 新建数据文件: item.csv

~ mkdir datafile

~ vi datafile/item.csv

1,101,5.0

1,102,3.0

1,103,2.5

2,101,2.0

2,102,2.5

2,103,5.0

2,104,2.0

3,101,2.5

3,104,4.0

3,105,4.5

3,107,5.0

4,101,5.0

4,103,3.0

4,104,4.5

4,106,4.0

5,101,4.0

5,102,3.0

5,103,2.0

5,104,4.0

5,105,3.5

5,106,4.0

数据解释:每一行有三列,第一列是用户ID,第二列是物品ID,第三列是用户对物品的打分。

2). Java程序:UserCF.java

Mahout协同过滤的数据流,调用过程。

上图摘自:Mahout in Action

新建JAVA类:org.conan.mymahout.recommendation.UserCF.java

package org.conan.mymahout.recommendation;

import java.io.File;

import java.io.IOException;

import java.util.List;

import org.apache.mahout.cf.taste.common.TasteException;

import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator;

import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;

import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;

import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;

import org.apache.mahout.cf.taste.impl.similarity.EuclideanDistanceSimilarity;

import org.apache.mahout.cf.taste.model.DataModel;

import org.apache.mahout.cf.taste.recommender.RecommendedItem;

import org.apache.mahout.cf.taste.recommender.Recommender;

import org.apache.mahout.cf.taste.similarity.UserSimilarity;

public class UserCF {

final static int NEIGHBORHOOD_NUM = 2;

final static int RECOMMENDER_NUM = 3;

public static void main(String[] args) throws IOException, TasteException {

String file = "datafile/item.csv";

DataModel model = new FileDataModel(new File(file));

UserSimilarity user = new EuclideanDistanceSimilarity(model);

NearestNUserNeighborhood neighbor = new NearestNUserNeighborhood(NEIGHBORHOOD_NUM, user, model);

Recommender r = new GenericUserBasedRecommender(model, neighbor, user);

LongPrimitiveIterator iter = model.getUserIDs();

while (iter.hasNext()) {

long uid = iter.nextLong();

List list = r.recommend(uid, RECOMMENDER_NUM);

System.out.printf("uid:%s", uid);

for (RecommendedItem ritem : list) {

System.out.printf("(%s,%f)", ritem.getItemID(), ritem.getValue());

}

System.out.println();

}

}

}

3). 运行程序

控制台输出:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".

SLF4J: Defaulting to no-operation (NOP) logger implementation

SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

uid:1(104,4.274336)(106,4.000000)

uid:2(105,4.055916)

uid:3(103,3.360987)(102,2.773169)

uid:4(102,3.000000)

uid:5

4). 推荐结果解读

向用户ID1,推荐前二个最相关的物品, 104和106

向用户ID2,推荐前二个最相关的物品, 但只有一个105

向用户ID3,推荐前二个最相关的物品, 103和102

向用户ID4,推荐前二个最相关的物品, 但只有一个102

向用户ID5,推荐前二个最相关的物品, 没有符合的

5. 用Mahout实现kmeans

注意:这些例子所使用的mahout是0.6版本,我用0.8的会报错。

1. 准备数据文件: randomData.csv

2. Java程序:Kmeans.java

3. 运行Java程序

4. mahout结果解读

5. 用R语言实现Kmeans算法

6. 比较Mahout和R的结果

1). 准备数据文件: randomData.csv

~ vi datafile/randomData.csv

-0.883033363823402,-3.31967192630249

-2.39312626419456,3.34726861118871

2.66976353341256,1.85144276077058

-1.09922906899594,-6.06261735207489

-4.36361936997216,1.90509905380532

-0.00351835125495037,-0.610105996559153

-2.9962958796338,-3.60959839525735

-3.27529418132066,0.0230099799641799

2.17665594420569,6.77290756817957

-2.47862038335637,2.53431833167278

5.53654901906814,2.65089785582474

5.66257474538338,6.86783609641077

-0.558946883114376,1.22332819416237

5.11728525486132,3.74663871584768

1.91240516693351,2.95874731384062

-2.49747101306535,2.05006504756875

3.98781883213459,1.00780938946366

这里只截取了一部分,更多的数据请查看源代码。

注:我是通过R语言生成的randomData.csv

x1

x2

x3

x

write.table(x,file="randomData.csv",sep=",",row.names=FALSE,col.names=FALSE)

2). Java程序:Kmeans.java

Mahout中kmeans方法的算法实现过程。

上图摘自:Mahout in Action

新建JAVA类:org.conan.mymahout.cluster06.Kmeans.java

package org.conan.mymahout.cluster06;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

import org.apache.mahout.clustering.kmeans.Cluster;

import org.apache.mahout.clustering.kmeans.KMeansClusterer;

import org.apache.mahout.common.distance.EuclideanDistanceMeasure;

import org.apache.mahout.math.Vector;

public class Kmeans {

public static void main(String[] args) throws IOException {

List sampleData = MathUtil.readFileToVector("datafile/randomData.csv");

int k = 3;

double threshold = 0.01;

List randomPoints = MathUtil.chooseRandomPoints(sampleData, k);

for (Vector vector : randomPoints) {

System.out.println("Init Point center: " + vector);

}

List clusters = new ArrayList();

for (int i = 0; i < k; i++) {

clusters.add(new Cluster(randomPoints.get(i), i, new EuclideanDistanceMeasure()));

}

List finalClusters = KMeansClusterer.clusterPoints(sampleData, clusters, new EuclideanDistanceMeasure(), k, threshold);

for (Cluster cluster : finalClusters.get(finalClusters.size() - 1)) {

System.out.println("Cluster id: " + cluster.getId() + " center: " + cluster.getCenter().asFormatString());

}

}

}

3). 运行Java程序

控制台输出:

Init Point center: {0:-0.162693685149196,1:2.19951550286862}

Init Point center: {0:-0.0409782183083317,1:2.09376666042057}

Init Point center: {0:0.158401778474687,1:2.37208412905273}

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".

SLF4J: Defaulting to no-operation (NOP) logger implementation

SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Cluster id: 0 center: {0:-2.686856800552941,1:1.8939462954763795}

Cluster id: 1 center: {0:0.6334255423230666,1:0.49472852972602105}

Cluster id: 2 center: {0:3.334520309711998,1:3.2758355898247653}

4). mahout结果解读

1. Init Point center表示,kmeans算法初始时的设置的3个中心点

2. Cluster center表示,聚类后找到3个中心点

5). 用R语言实现Kmeans算法

接下来为了让结果更直观,我们再用R语言,进行kmeans实验,操作相同的数据。

R语言代码:

> y

> cl

> cl$centers

V1 V2

1 -0.4323971 2.2852949

2 0.9023786 -0.7011153

3 4.3725463 2.4622609

# 生成聚类中心的图形

> plot(y, col=c("black","blue","green")[cl$cluster])

> points(cl$centers, col="red", pch = 19)

# 画出Mahout聚类的中心

> mahout

> points(mahout, col="violetred", pch = 19)

聚类的效果图:

6). 比较Mahout和R的结果

从上图中,我们看到有 黑,蓝,绿,三种颜色的空心点,这些点就是原始的数据。

3个红色实点,是R语言kmeans后生成的3个中心。

3个紫色实点,是Mahout的kmeans后生成的3个中心。

R语言和Mahout生成的点,并不是重合的,原因有几点:

1. 距离算法不一样:

Mahout中,我们用的 “欧氏距离(EuclideanDistanceMeasure)”

R语言中,默认是”Hartigan and Wong”

2. 初始化的中心是不一样的。

3. 最大迭代次数是不一样的。

4. 点合并时,判断的”阈值(threshold)”是不一样的。

6. 模板项目上传github

大家可以下载这个项目,做为开发的起点。

java调用集群mahout_Mahout--用Maven构建Mahout项目(mahoutDemo)相关推荐

  1. 转】用Maven构建Mahout项目

    原博文出自于: http://blog.fens.me/hadoop-mahout-maven-eclipse/ 感谢! 用Maven构建Mahout项目 Hadoop家族系列文章,主要介绍Hadoo ...

  2. 用Maven构建Mahout项目

    Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, ...

  3. 一周碎碎念,2021.11.7,两个MGR集群间还可以构建传统的主从复制通道吗

    叨叨最近遇到的一些事以及见闻.思考. 1. GreatSQL编译环境Dockerfile更新了 用于构建GreatSQL编译环境的Dockerfile发现几个小瑕疵,于是更新了下. 利用Docker环 ...

  4. 转】用Maven构建Hadoop项目

    原博文出自于: http://blog.fens.me/hadoop-maven-eclipse/ 感谢! 用Maven构建Hadoop项目 Hadoop家族系列文章,主要介绍Hadoop家族产品,常 ...

  5. maven(3)------maven构建web项目详细步骤

    eclipse集成工具,轻松通过maven构建web项目步骤如下: 一, 右键,new -->project, 进入下一页面 二,选择"Maven Project", 点击下 ...

  6. 设置maven 参数调休_IDEA 使用 Maven构建Spark项目

    上一篇讲了普通构建spark项目 这次分享用Maven构建Spark项目,中间遇到了很多坑!其根本原因是Scala 与 Spark的版本不一致! 本次环境: Java1.8 Scala 2.11.8 ...

  7. IntelliJ 使用Maven构建Android项目过程

    这是我的第一篇博客!对我的意义十分重大!在这篇博客的编写过程就是我在使用Maven构建Android项目中踩过的坑的记录.在此由于本人的水平有限,这篇文章也只能当作经验借鉴而已,希望后来者能够避开这些 ...

  8. Java集群优化——dubbo+zookeeper构建高可用分布式集群

    为什么80%的码农都做不了架构师?>>>    不久前,我们讨论过Nginx+tomcat组成的集群,这已经是非常灵活的集群技术,但是当我们的系统遇到更大的瓶颈,全部应用的单点服务器 ...

  9. java kafka 集群消费_kafka集群搭建和使用Java写kafka生产者消费者

    转自:http://chengjianxiaoxue.iteye.com/blog/2190488 1 kafka集群搭建 1.zookeeper集群 搭建在110, 111,112 2.kafka使 ...

最新文章

  1. 【Vegas原创】outlook发送时,报550 5.7.1 client does not have permissions to send as this sender解决方法...
  2. kernel笔记——中断
  3. C/C++常见的预处理指令
  4. Android Bitmap开发之旅--基本操作
  5. 大剑无锋之UNION 和 UNION ALL (SQL)【面试推荐】
  6. 大数据python试卷_大数据起步--Python语言-中国大学mooc-试题题目及答案
  7. mysqldump对mysql数据库的影响
  8. git push 到github配置(问题Pushing to Git returning Error Code 403 fatal: HTTP request failed)
  9. H5页面设计器,仿有赞商城页面在线设计器,比富文本框更友好的内容编辑器...
  10. python实现用户画像分析案例
  11. aloha协议c语言实现,任务ALOHA协议的OPNET仿真.doc
  12. 十六、 Interpreter 解释器(行为型模式)
  13. Linux下查找结构体定义的位置
  14. 2021年初级会计职称《初级会计实务》考试真题资产内容
  15. ev3和python哪个好_乐高教育EV3比SPIKE Prime更好的十个理由!
  16. php邮箱必填,ZBlogPHP-1.5 以上版本修改实现用户评论时必填邮箱的功能
  17. 会说话的简历 TalkingCV
  18. 【博学谷学习记录】超强总结,用心分享 | JavaSE入门基础知识总结
  19. CF39C Moon Craters
  20. Python-深度学习-学习笔记(13):keras搭建卷积神经网络(对二维数据进行一维卷积)

热门文章

  1. typescript项目中引入汉字转拼音js
  2. 数据库---数据查询
  3. php新闻网站毕设论文,校园新闻发布毕业设计网站php实现
  4. HCIA-Cloud Computing华为认证云计算工程师(持续更新中 5%)
  5. 蓝牙控制摇摇棒(电子综合设计)
  6. linux系统下SVN服务器搭建
  7. 各种音视频编解码学习详解之 编解码学习笔记(十三):容器
  8. QQ2011在Windows系统下安装失败
  9. 标题 错误票据c语言,内含答案的 -- 2013蓝桥杯C语言本科组B.doc
  10. 模拟位置信息应用-Fake Location模拟安卓手机定位