Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Apache Mahout项目已经发展到了它的第三个年头,目前已经有了三个公共发行版本。Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。此外,通过使用 Apache Hadoop 库,Mahout 可以有效地扩展到云中。
Mahout 的创始人 Grant Ingersoll 介绍了机器学习的基本概念,并演示了如何使用 Mahout 来实现文档聚类、提出建议和组织内容。下图中,左图是 Hadoop,右图是 Mahout 的logo
Mahout 是一个很强大的数据挖掘工具,是一个分布式机器学习算法的集合,包括:被称为Taste的分布式协同过滤的实现、分类、聚类等。Mahout最大的优点就是基于hadoop实现,把很多以前运行于单机上的算法,转化为了MapReduce模式,这样大大提升了算法可处理的数据量和处理性能。
关于 Mahout 的安装配置,这里介绍两种方式:其一,下载完整包进行解压缩(简单);其二,下载源码(直接下载源码或者通过 svn 下载源码都可以)。下面先介绍简单的一种喽~
1. 下载 Mahout 发布版
2. 解压安装 Mahout
将压缩文件解压到 /home/hadoop/
tar -zxvf apache-mahout-distribution-0.11.0.tar.gz
3. 配置环境变量
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_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_HOME/bin/mahout
里面进行设置,实际上$MAHOUT_HOME/bin/mahout
就是Mahout在命令行的启动脚本,这一点与Hadoop相似,但也又不同$HADOOP_HOME\conf
下面还提供了专门的hadoop-env.sh文件进行相关环境变量的配置,而Mahout在conf目录下没有提供这样的文件MAHOUT_LOCAL
与 HADOOP_CONF_DIR
这两个参数是控制 Mahout 是在本地运行还是在 Hadoop 上运行的关键。$MAHOUT_HOME/bin/mahout
文件指出,只要设置 MAHOUT_LOCAL
的值为一个非空(not empty string)值,则不管用户有没有设置 HADOOP_CONF_DIR
和 HADOOP_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为非空的语句即可
1. 启动 hadoop 集群(无论是伪分布还是完全分布)
搭建 hadoop 完全分布请参考、搭建 hadoop 伪分布请参考
start-dfs.sh start-yarn.sh
2. 下载测试数据
$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. 上传测试数据
hadoop fs -mkdir -p /user/hadoop/testdata
hadoop fs -mkdir -p /user/hadoop/output
可以下列语句查看是否创建成功
hadoop fs -ls -R output
重点强调:笔者我不得不提醒下各位别再掉进我当时遇到的坑
hadoop fs -mkdir /testdata
这样做的后果是,你后面运行程序时,会弹出找不到 hdfs://localhost:9000/user/hadoop/testdata 的报错信息。原因在于网上的教程(应该就是官网的例子吧),是运行在本地上,所以肯定不适合运行在 hadoop 上的。既然它说 /user/hadoop/testdata 不存在,那就给它创建一个不就完事了么!!!
hadoop fs -put $MAHOUT_HOME/synthetic_control.data /user/hadoop/testdata
hadoop jar mahout-examples-0.11.0-job.jar org.apache.mahout.clustering.syntheticcontrol.kmeans.Job
然后就是静静地等待最终结果出来吧…. 几分钟而已的事,最后出现如下信息(只截取部分):
hadoop fs -ls /user/hadoop/output
在终端可以看到程序运行的信息,程序分别运行了几个 Job 任务,最后把原始数据分为六类,在 HDFS 文件系统中可以看到这些输出的文件,但是这些文件都是序列文件,我们使用 Mahout 的文件转换把序列文件转化为文本文件,这样就能比较清晰地分析输出结果。
mahout vectordump -i /user/hadoop/output/data/part-m-00000
mahout0.8版本之前用这个
mahout vectordump --seqFile /user/hadoop/output/data/part-m-00000查看
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 ```
解决方案:
<property>
<name>hadoop.native.lib</name>
<value>true</value>
<description>Should native hadoop libraries, if present, be used.</description>
</property>
export JAVA_LIBRARY_PATH=/path/to/hadoop-native-libs
ant compile-native
1. 安装 svn 以及 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
补充说明:
mvn clean install
mvn -Dhadoop2.version=2.2.0 clean install
mvn -Dhadoop2.version=2.2.0 -DskipTests clean install
mvn -Dhadoop2.version=2.2.0 clean package
4. 查看编译后文件
./mahout
./mahout
解决方案:删除 /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中文乱码的问题