Centos6.5 + Hadoop2.2.0 + Mahout安装(Maven & 发布版安装)

Mahout 简介

  Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Apache Mahout项目已经发展到了它的第三个年头,目前已经有了三个公共发行版本。Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。此外,通过使用 Apache Hadoop 库,Mahout 可以有效地扩展到云中。
  Mahout 的创始人 Grant Ingersoll 介绍了机器学习的基本概念,并演示了如何使用 Mahout 来实现文档聚类、提出建议和组织内容。下图中,左图是 Hadoop,右图是 Mahout 的logo
  
这里写图片描述   Centos6.5 + Hadoop2.2.0 + Mahout安装(Maven & 发布版安装)_第1张图片

   Mahout 是一个很强大的数据挖掘工具,是一个分布式机器学习算法的集合,包括:被称为Taste的分布式协同过滤的实现、分类、聚类等。Mahout最大的优点就是基于hadoop实现,把很多以前运行于单机上的算法,转化为了MapReduce模式,这样大大提升了算法可处理的数据量和处理性能。

Mahout 安装配置

  关于 Mahout 的安装配置,这里介绍两种方式:其一,下载完整包进行解压缩(简单);其二,下载源码(直接下载源码或者通过 svn 下载源码都可以)。下面先介绍简单的一种喽~
  

环境说明:

  • Centos 6.5 操作系统
  • hadoop 2.2.0
  • 在用户 haddop 下操作,安装基本上也是在该目录下

1. 下载 Mahout 发布版

  • 下载0.11.0版本 apache-mahout-distribution-0.11.0.tar.gz (笔者本人使用这个)
  • 下载0.7.0版本 mahout-distribution-0.7.tar.gz

2. 解压安装 Mahout
将压缩文件解压到 /home/hadoop/

tar -zxvf apache-mahout-distribution-0.11.0.tar.gz

3. 配置环境变量

  • 在 /home/hadoop/.bash_profile 中添加配置信息
export MAHOUT_HOME=/home/hadoop/apache-mahout-distribution-0.11.0
export PATH=$PATH:$MAHOUT_HOME/bin
export CLASSPATH=$CLASSPATH:$MAHOUT/lib
export MAHOUT_LOCAL=

4. 验证Mahout是否安装成功

  • 执行命令mahout。若列出一些算法,则成功,如图

    Centos6.5 + Hadoop2.2.0 + Mahout安装(Maven & 发布版安装)_第2张图片

  • 如果看到上述的信息,恭喜你,已经基本安装成功了,很简单的…

    但是这里要重点强调一下:上面出现的信息

MAHOUT_LOCAL is not set; adding HADOOP_CONF_DIR to classpath.
Running on hadoop, using /home/hadoop/hadoop-2.2.0/bin/hadoop and HADOOP_CONF_DIR=/home/hadoop/hadoop-2.2.0/etc/hadoop
MAHOUT-JOB: /home/hadoop/apache-mahout-distribution-0.11.0/mahout-examples-0.11.0-job.jar

  并不是说配置有误,恰恰相反,要是配置了变量 MAHOUT_LOCAL,那么完全体现不出 Mahout 的威力了,具体的可参考下面的解释

  • Mahout运行配置可以在 $MAHOUT_HOME/bin/mahout 里面进行设置,实际上$MAHOUT_HOME/bin/mahout就是Mahout在命令行的启动脚本,这一点与Hadoop相似,但也又不同
  • Hadoop在 $HADOOP_HOME\conf 下面还提供了专门的hadoop-env.sh文件进行相关环境变量的配置,而Mahout在conf目录下没有提供这样的文件
  • MAHOUT_LOCALHADOOP_CONF_DIR 这两个参数是控制 Mahout 是在本地运行还是在 Hadoop 上运行的关键。$MAHOUT_HOME/bin/mahout 文件指出,只要设置 MAHOUT_LOCAL 的值为一个非空(not empty string)值,则不管用户有没有设置 HADOOP_CONF_DIRHADOOP_HOME 这两个参数,Mahout 都以本地模式运行;换句话说,如果要想 Mahout 运行在 Hadoop上,则 MAHOUT_LOCAL 必须为空
  • HADOOP_CONF_DIR参数指定Mahout运行Hadoop模式时使用的Hadoop配置信息,这个文件目录一般指向的是$HADOOP_HOME目录下的conf目录

    除此之外,我们还应该设置 JAVA_HOME 或者 MAHOUT_JAVA_HOME 变量,以及必须将 Hadoop 的执行文件加入到PATH中。要想使用本地模式运行,只需在 $MAHOUT_HOME/bin/mahout 添加一条设置MAHOUT_LOCAL为非空的语句即可

运行一个简单的 Mahout 程序

1. 启动 hadoop 集群(无论是伪分布还是完全分布)
 搭建 hadoop 完全分布请参考、搭建 hadoop 伪分布请参考

  • 在 master 主机上启动
start-dfs.sh start-yarn.sh

2. 下载测试数据

  • 在浏览器中输入: http://archive.ics.uci.edu/ml/databases/synthetic_control/synthetic_control.data
  • 将数据复制粘贴到 synthetic_control.data 新建文件中,并将其放置在 $MAHOUT_HOME 目录下
    笔者我的 $MAHOUT_HOME 目录就是 /home/hadoop/apache-mahout-distribution-0.11.0

数据说明: 该数据是由 Dr Robert Alcock 在1999年利用程序合成的 600 个样本的控制图数据,每个样本包括 60 个属性列,一共可以分为 6 个类,分别为 正常(C)、循环(B)、上升趋势(E)、下降趋势(A)、向上移位(D)、向下移位(F)

3. 上传测试数据

  • 在 hdfs 上创建 testdata 目录(强行规定为这个 testdata,没商量)以及输出结果路径
hadoop fs -mkdir -p /user/hadoop/testdata 
hadoop fs -mkdir -p /user/hadoop/output 

  可以下列语句查看是否创建成功

hadoop fs -ls -R output

重点强调:笔者我不得不提醒下各位别再掉进我当时遇到的坑

  1. 相对路径不能用,必须用绝对路径创建(即必须用 /user/hadoop/testdata 代替 user/hadoop/testdata)
  2. 那就是网上很多教程都是这样的
hadoop fs -mkdir /testdata 

  这样做的后果是,你后面运行程序时,会弹出找不到 hdfs://localhost:9000/user/hadoop/testdata 的报错信息。原因在于网上的教程(应该就是官网的例子吧),是运行在本地上,所以肯定不适合运行在 hadoop 上的。既然它说 /user/hadoop/testdata 不存在,那就给它创建一个不就完事了么!!!

  • 上传 testdata 数据到 hdfs
hadoop fs -put $MAHOUT_HOME/synthetic_control.data /user/hadoop/testdata
  • 接下来就是运行 Mahout 中的 kmeans 聚类算法,执行命令
hadoop jar mahout-examples-0.11.0-job.jar org.apache.mahout.clustering.syntheticcontrol.kmeans.Job

接着会连续出现以下信息,说明正常运行了
Centos6.5 + Hadoop2.2.0 + Mahout安装(Maven & 发布版安装)_第3张图片

然后就是静静地等待最终结果出来吧…. 几分钟而已的事,最后出现如下信息(只截取部分):

Centos6.5 + Hadoop2.2.0 + Mahout安装(Maven & 发布版安装)_第4张图片

  • 查看聚类结果
hadoop fs -ls /user/hadoop/output

Centos6.5 + Hadoop2.2.0 + Mahout安装(Maven & 发布版安装)_第5张图片

将序列结果转化成文本文件

  在终端可以看到程序运行的信息,程序分别运行了几个 Job 任务,最后把原始数据分为六类,在 HDFS 文件系统中可以看到这些输出的文件,但是这些文件都是序列文件,我们使用 Mahout 的文件转换把序列文件转化为文本文件,这样就能比较清晰地分析输出结果。
  

  • 用cat查看数据是乱码,用mahout转换下
mahout vectordump -i /user/hadoop/output/data/part-m-00000

  mahout0.8版本之前用这个

mahout vectordump --seqFile   /user/hadoop/output/data/part-m-00000查看

Centos6.5 + Hadoop2.2.0 + Mahout安装(Maven & 发布版安装)_第6张图片

  • 或打开终端,输入命令(只取其中的 clusters-0):
mahout clusterdump -i /user/hadoop/output/clusters-0 -p /user/hadoop/clusteredPoints -o /home/hadoop/test

  参数说明: -i 是输入文件路径,即运行 Canopy 算法产生的中心点文件路径(HDFS文件系统); -p 是运行 Canopy 算法后把原始数据分类后的数据文件目录(HDFS文件系统); -o 是分类结果的所有文本文件要生成的文件路径(本地文件系统)。clusterdump 是有其他参数的,这里只用到这三个就可以了。关于其他参数,直接运行 clisterdump (不加任何参数)即可以看到参数提示信息
  
  也许上述命令后,会出现下列 warning

WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java 

  Hadoop是使用Java语言开发的,但是有一些需求和操作并不适合使用java,所以就引入了本地库(Native Libraries)的概念,通过本地库,Hadoop可以更加高效地执行某一些操作。目前在Hadoop中,本地库应用在文件的压缩上面: zlib 以及 gzip

  在使用这两种压缩方式的时候,Hadoop默认会从$HADOOP_HOME/lib/native/Linux-*目录中加载本地库。如果加载成功,输出为:

DEBUG util.NativeCodeLoader - Trying to load the custom-built native-hadoop library...
INFO util.NativeCodeLoader - Loaded the native-hadoop library

  如果加载失败,输出为(笔者我就有幸遇到了):

INFO util.NativeCodeLoader - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable ```

  解决方案:

  • 在Hadoop的配置文件core-site.xml中可以设置是否使用本地库:
<property>
  <name>hadoop.native.lib</name>
  <value>true</value>
  <description>Should native hadoop libraries, if present, be used.</description>
</property>
  • Hadoop默认的配置为启用本地库
  • 另外,可以在环境变量中设置使用本地库的位置(笔者我使用这个):
export JAVA_LIBRARY_PATH=/path/to/hadoop-native-libs
  • 有的时候也会发现Hadoop自带的本地库无法使用,这种情况下就需要自己去编译本地库了。在$HADOOP_HOME目录下,使用如下命令即可(暂时未用到,以备后用):
ant compile-native
  • 编译完成后,可以在$HADOOP_HOME/build/native目录下找到相应的文件,然后指定文件的路径或者移动编译好的文件到默认目录下即可

使用 Maven 安装

1. 安装 svn 以及 maven

  • SVN安装请参考笔者博文 Centos6.5 下SVN配置
  • Maven安装请参考笔者博文 Centos6.5 编译软件安装 (maven)

2. 下载 Mahout 源代码

svn co http://svn.apache.org/repos/asf/mahout/trunk

等到全部下载完成后,可以在本地的 /home/mahout/trunk 目录下看到下面的 Mahout 源代码。当然也可以在 Mahout 官网(本博文前面已经提及了)直接下载 src 版本的源代码,下载后的文件与上面的一致(svn下载的是最新版本,笔者我下载的版本是1.0-)

3. 在 /home/hadoop/trunk 中使用以下命令(编译)

mvn -DskipTests clean install

补充说明:

  • 可以用下面的命令编译Mahout
mvn clean install
  • 如果你直接这样编译,项目将默认依赖hadoop-1.2.1,如果你想修改Hadoop的默认版本,可以用下面的Maven命令:
mvn -Dhadoop2.version=2.2.0 clean install
  • Mahout 自带的源码包里面有许多测试用例,如果你用上面的命令去编译,将会把测试用例一起编译,这将耗费许多的时间,所以如果你最想编译 Mahout 而忽略测试用例,那么请用下面的命令进行编译
mvn -Dhadoop2.version=2.2.0 -DskipTests clean install
  • 上面的命令只是编译了 Mahout,如果你想将工程打包,可以用下面的命令进行编译
mvn -Dhadoop2.version=2.2.0 clean package
  • 编译的过程需要下载许多的Jar依赖,所以编译的过程依赖你网络的速度,坐在那慢慢等吧。如果一切顺利的话,你将看到如下的输出信息:

Centos6.5 + Hadoop2.2.0 + Mahout安装(Maven & 发布版安装)_第7张图片

4. 查看编译后文件

  • 编译之前在 /home/hadoop/trunk/bin 目录下,键入 ./mahout

这里写图片描述

  • 编译成功之后,再次键入 ./mahout

Centos6.5 + Hadoop2.2.0 + Mahout安装(Maven & 发布版安装)_第8张图片

  • 笔者认为编译之后的 Mahou 还是 trunk这个目录(其实就是在原来的文件上增加了东西)。可以看到,在有的目录下,如 examples下,会有 target 目录,这个就是编译之后新生成的目录

这里要强调一下笔者我当时遇到的一个大坑,奋战到凌晨2点还未解决….醒来就..解决了。问题描述如下:

  • 面上的原因是:apache-9.pom这个pom文件里可能有语法错误
  • 实际的原因可能是笔者当时没上网,然后它 maven 编译(必须上网下载相应的 jar 包),所以产生了坏的 apache-9.pom文件

解决方案:删除 /home/hadoop/.m2/repository/org 文件(貌似当时也就这么一个文件),然后在确保能上网的情况下,重新输入上述编译指令即可

参考博客资料

Mahout学习之Mahout简介、安装、配置、入门程序测试
Mahout安装与配置
mahout安装配置,运行kmeans算法,bin/mahout -help出现MAHOUT_LOCAL is not set; adding HADOOP_CONF_DIR to classpath
Hadoop的本地库(Native Libraries)介绍
用Maven编译Mahout工程
还有其他问题,但是暂时还没遇到:Hadoop中文乱码的问题

你可能感兴趣的:(Centos6.5 + Hadoop2.2.0 + Mahout安装(Maven & 发布版安装))