hadoop学习-mahout-Bayes分类算法示例程序

来源:互联网 发布:淘宝怎么延长收货十天 编辑:程序博客网 时间:2024/05/22 12:35

首先在运行贝叶斯算法程序之前,运行环境要求:

1、安装maven(书中没提到的)

2、安装mahout

3、安装hadoop

关于2,3的安装方式可以参考书本里或者网上的方法。

下面说说安装maven过程,网上很多是直接下载 tar包,然后解压出来。 http://apache.etoak.com//maven/binaries/apache-maven-3.0.2-bin.tar.gz

我是直接在终端下通过apt-get指令安装,两者方法区别不大 :

1、sudo apt-get maven2

2、设置环境变量,在/etc/profile中加入

export M2_HOME=/usr/local/maven
export PATH=${M2_HOME}/bin:${PATH}

以下是我的配置:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. export JAVA_HOME=/usr/lib/jdk/jdk1.7.0_40  
  2. export PATH=$PATH:$JAVA_HOME/bin  
  3. export CLASSPATH=.:$JAVA_HOME/lib/rt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar  
  4. export HADOOP_HOME=/root/hadoop-1.2.1  
  5. #export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH:$HADOOP_HOME/hadoop-core-1.2.1.jar  
  6.   
  7. export M2_HOME=/usr/share/maven2  
  8. export PATH=${M2_HOME}/bin:${PATH}  
  9. export HADOOP_CONF_DIR=/root/hadoop-1.2.1/conf  
  10. export MAHOUT_HOME=/root/mahout/mahout-distribution-0.9  
  11. export PATH=${MAHOUT_HOME}/bin:${PATH}  
3、修改/usr/share/maven2/conf/settings.xml

因为我是通过apt-get方式安装,所以maven2目录在/usr/share之下,通过解压出来的,只要在相应目录下找到conf/settings.xml即可。

大约在第50行。

添加<localRepository>/root/.m2/repository</localRepository>,因为我这里是root用户,直接把~改成root了。默认是~/.m2/repository

以下是我的配置

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"  
  2.           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.           xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">  
  4. <localRepository>/root/.m2/repository</localRepository>  
  5.   <!-- localRepository  
  6.    | The path to the local repository maven will use to store artifacts.  
  7.    |  
  8.    | Default: ~/.m2/repository  
  9.   <localRepository>/root/.m2/repository</localRepository>  
  10.   -->  

4、查看maven是否安装成功

mvn -version

Apache Maven 2.2.1 (rdebian-1)
Java version: 1.7.0_40
Java home: /usr/lib/jdk/jdk1.7.0_40/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux" version: "2.6.32-46-generic" arch: "i386" Family: "unix"

之后就是参考书本的13.4.5章节,运行示例了。

我在运行

bin/hadoop jar /root/mahout/mahout-distribution-0.9/mahout-examples-0.9-job.jar org.apache.mahout.classifier.bayes.TrainClassifier -i 20news-input -o newsmodel -ng 3 -type bayes -source hdfs

报错如下


多次百度,谷歌,未果。。。。

无奈参考其中一篇博文的曲线救国法。

运行~/mahout/mahout-distribution-0.9/examples/bin目录下自带的classify-20newsgroups.sh脚本

首先我们来看看这个脚本的部分代码:

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #WORK_DIR=/tmp/mahout-work-${USER}  
  2. WORK_DIR=/root/hadoop-1.2.1/20news-input  
  3. algorithm=( cnaivebayes naivebayes sgd clean)  
  4. if [ -n "$1" ]; then  
  5.   choice=$1  
  6. else  
  7.   echo "Please select a number to choose the corresponding task to run"  
  8.   echo "1. ${algorithm[0]}"  
  9.   echo "2. ${algorithm[1]}"  
  10.   echo "3. ${algorithm[2]}"  
  11.   echo "4. ${algorithm[3]} -- cleans up the work area in $WORK_DIR"  
  12.   read -p "Enter your choice : " choice  
  13. fi  
  14.   
  15. echo "ok. You chose $choice and we'll use ${algorithm[$choice-1]}"  
  16. alg=${algorithm[$choice-1]}  
  17.   
  18. if [ "x$alg" != "xclean" ]; then  
  19.   echo "creating work directory at ${WORK_DIR}"  
  20.   
  21.   #mkdir -p ${WORK_DIR}  
  22.   if [ ! -e ${WORK_DIR}/20news-bayesinput ]; then  
  23.     if [ ! -e ${WORK_DIR}/20news-bydate ]; then  
  24.       if [ ! -f ${WORK_DIR}/20news-bydate.tar.gz ]; then  
  25.         echo "Downloading 20news-bydate"  
  26.         curl http://people.csail.mit.edu/jrennie/20Newsgroups/20news-bydate.tar.gz -o ${WORK_DIR}/20news-bydate.tar.gz  
  27.       fi  
  28.       mkdir -p ${WORK_DIR}/20news-bydate  
  29.       echo "Extracting..."  
  30.       cd ${WORK_DIR}/20news-bydate && tar xzf ../20news-bydate.tar.gz && cd .. && cd ..  
  31.     fi  
  32.   fi  
  33. fi  
阅读这段代码,我们会看到一开始会让用户选择 4个选项
1. cnaivebayes 
2. naivebayes 
3. sgd 
4. clean
其中最后一个选项clean是表示清空数据文件所在的临时目录。
当你选择前三项中的一项时,代码将判断工作目录${WORK_DIR}中有没有20news-bydate.tar.gz, 如果没有,通过curl 去http://people.csail.mit.edu取。这里要求你的机器上安装有curl 。

因为这里我的机器没有安装curl,而且已经下载好了20news-bydate.tar.gz(可以从http://qwone.com/~jason/20Newsgroups/下载)。所以我不希望再通过curl去下载,因此我手动修改了这个代码。
修改:WORK_DIR=/root/hadoop-1.2.1/20news-input

注释:#mkdir -p ${WORK_DIR}

这里的20news-input存放有20news-bydate.tar.gz

也不需要再创建这个目录,所以直接注释#mkdir -p ${WORK_DIR}

为了保留原始版本,改完后我另存为myclassify-20newsgroups.sh

然后运行./myclassify-20newsgroups.sh

因为这里有解压,上传到hdfs等等操作,需要等一会儿。。。

等我午饭归来,success!



至于原来的方式的错误,我还没找到解决方法,希望有知道的朋友能指教下,也期待一起学习hadoop的朋友一起交流下,谢谢。

参考资料:

http://f.dataguru.cn/forum.php?mod=viewthread&tid=239064&fromuid=41168

http://log.medcl.net/item/2011/02/mahout_install/

《mahout in action》
0 0
原创粉丝点击