Hadoop入門進階課程9--Mahout介紹、安裝與應用案例
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,博主為石山園,博客地址為 http://www.rzrgm.cn/shishanyuan 。該系列課程是應邀實驗樓整理編寫的,這里需要贊一下實驗樓提供了學習的新方式,可以邊看博客邊上機實驗,課程地址為 https://www.shiyanlou.com/courses/237
【注】該系列所使用到安裝包、測試數據和代碼均可在百度網盤下載,具體地址為 http://pan.baidu.com/s/10PnDs,下載該PDF文件
1、搭建環境
部署節點操作系統為CentOS,防火墻和SElinux禁用,創建了一個shiyanlou用戶并在系統根目錄下創建/app目錄,用于存放Hadoop等組件運行包。因為該目錄用于安裝hadoop等組件程序,用戶對shiyanlou必須賦予rwx權限(一般做法是root用戶在根目錄下創建/app目錄,并修改該目錄擁有者為shiyanlou(chown –R shiyanlou:shiyanlou /app)。
Hadoop搭建環境:
l 虛擬機操作系統: CentOS6.6 64位,單核,1G內存
l JDK:1.7.0_55 64位
l Hadoop:1.1.2
2、Mahout介紹
Mahout 是 Apache Software Foundation(ASF) 旗下的一個開源項目,提供一些可擴展的機器學習領域經典算法的實現,旨在幫助開發人員更加方便快捷地創建智能應用程序。AMahout包含許多實現,包括聚類、分類、推薦過濾、頻繁子項挖掘。此外,通過使用 Apache Hadoop 庫,Mahout 可以有效地擴展到云中。
Mahout的意思是大象的飼養者及驅趕者。Mahout 這個名稱來源于該項目(有時)使用 Apache Hadoop —其徽標上有一頭黃色的大象 —來實現可伸縮性和容錯性。
Mahout 項目是由 Apache Lucene(開源搜索)社區中對機器學習感興趣的一些成員發起的,他們希望建立一個可靠、文檔翔實、可伸縮的項目,在其中實現一些常見的用于集群和分類的機器學習算法。該社區最初基于 Ng et al. 的文章 “Map-Reduce for Machine Learning on Multicore”(見 參考資料),但此后在發展中又并入了更多廣泛的機器學習方法。Mahout 的目標還包括:
l 建立一個用戶和貢獻者社區,使代碼不必依賴于特定貢獻者的參與或任何特定公司和大學的資金。
l 專注于實際用例,這與高新技術研究及未經驗證的技巧相反。
l 提供高質量文章和示例
3、搭建Mahout環境
3.1 部署過程
3.1.1 下載Mahout
在Apache下載最新的Mahout軟件包,點擊下載會推薦最快的鏡像站點,以下為下載地址:http://archive.apache.org/dist/mahout/0.6/
也可以在/home/shiyanlou/install-pack目錄中找到該安裝包,解壓該安裝包并把該安裝包復制到/app目錄中
cd /home/shiyanlou/install-pack
tar -xzf mahout-distribution-0.6.tar.gz
mv mahout-distribution-0.6 /app/mahout-0.6
3.1.2 設置環境變量
使用如下命令編輯/etc/profile文件:
sudo vi /etc/profile
聲明mahout的home路徑和在path加入bin的路徑:
export MAHOUT_HOME=/app/mahout-0.6
export MAHOUT_CONF_DIR=/app/mahout-0.6/conf
export PATH=$PATH:$MAHOUT_HOME/bin
編譯配置文件/etc/profile,并確認生效
source /etc/profile
echo $PATH
3.1.3 驗證安裝完成
重新登錄終端,確保hadoop集群啟動,鍵入mahout --help命令,檢查Mahout是否安裝完好,看是否列出了一些算法:
mahout --help
3.2 測試例子
3.2.1 下載測試數據
下載一個文件synthetic_control.data,下載地址http://archive.ics.uci.edu/ml/databases/synthetic_control/synthetic_control.data,也可以在/home/shiyanlou/install-pack/class9目錄中找到該測試數據文件,把這個文件放在$MAHOUT_HOME/testdata目錄下
cd /home/shiyanlou/install-pack/class9
mkdir /app/mahout-0.6/testdata
mv synthetic_control.data /app/mahout-0.6/testdata
3.2.2 啟動Hadoop
通過下面命令啟動hadoop并通過jps查看進程
cd /app/hadoop-1.1.2/bin
./start-all.sh
jps
3.2.3 使用kmeans算法
使用如下命令進行kmeans算法測試:
cd /app/mahout-0.6/
mahout org.apache.mahout.clustering.syntheticcontrol.kmeans.Job
這里需要說明下,當你看到下面的代碼時以為是錯的,其實不是,原因:MAHOUT_LOCAL:設置是否本地運行,如果設置該參數就不會在hadoop運行了,一旦設置這個參數那HADOOP_CONF_DIR 和HADOOP_HOME兩個參數就自動失效了。
MAHOUT_LOCAL is not set, so we don't add HADOOP_CONF_DIR to classpath.
no HADOOP_HOME set , running locally
3.2.4 查看結果
結果會在根目錄建立output新文件夾,如果下圖結果表示mahout安裝正確且運行正常:
cd /app/mahout-0.6/output
ll
4、測試例子:運行20newsgroup
4.1 算法流程
樸素貝葉斯分類是一種十分簡單的分類算法,樸素貝葉斯的思想基礎是這樣的:對于給出的待分類項,求解在此項出現的條件下各個類別出現的概率哪個最大,就認為此待分類項屬于哪個類別。
這二十個新聞組數據集合是收集大約20,000新聞組文檔,均勻的分布在20個不同的集合。這20個新聞組集合采集最近流行的數據集合到文本程序中作為實驗,根據機器學習技術。例如文本分類,文本聚集。我們將使用Mahout的Bayes Classifier創造一個模型,它將一個新文檔分類到這20個新聞組集合范例演示
4.2 實現過程(mahout 0.6版本)
4.2.1 下載數據并解壓數據
下載20Newsgroups數據集,地址為 http://qwone.com/~jason/20Newsgroups/ ,下載20news-bydate.tar.gz數據包,也可以在/home/shiyanlou/install-pack/class9目錄中找到該測試數據文件:
解壓20news-bydate.tar.gz數據包,解壓后可以看到兩個文件夾,分別為訓練原始數據和測試原始數據:
cd /home/shiyanlou/install-pack/class9
tar -xzf 20news-bydate.tar.gz
在mahout根目錄下建data文件夾,然后把20news訓練原始數據和測試原始數據遷移到該文件夾下:
mkdir /app/mahout-0.6/data
mv 20news-bydate-t* /app/mahout-0.6/data
ll /app/mahout-0.6/data
4.2.2 建立訓練集
通過如下命令建立訓練集,訓練的數據在20news-bydate-train目錄中,輸出的訓練集目錄為 bayes-train-input:
cd /app/mahout-0.6
mahout org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups \
-p /app/mahout-0.6/data/20news-bydate-train \
-o /app/mahout-0.6/data/bayes-train-input \
-a org.apache.mahout.vectorizer.DefaultAnalyzer \
-c UTF-8
4.2.3 建立測試集
通過如下命令建立訓練集,訓練的數據在20news-bydate-test目錄中,輸出的訓練集目錄為 bayes-test-input:
mahout org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups \
-p /app/mahout-0.6/data/20news-bydate-test \
-o /app/mahout-0.6/data/bayes-test-input \
-a org.apache.mahout.vectorizer.DefaultAnalyzer \
-c UTF-8
4.2.4 上傳數據到HDFS
在HDFS中新建/class9/20news文件夾,把生成的訓練集和測試集上傳到HDFS的/class9/20news目錄中:
hadoop fs -mkdir /class9/20news
hadoop fs -put /app/mahout-0.6/data/bayes-train-input /class9/20news
hadoop fs -put /app/mahout-0.6/data/bayes-test-input /class9/20news
hadoop fs -ls /class9/20news
hadoop fs -ls /class9/20news/bayes-test-input
4.2.5 訓練貝葉斯分類器
使用trainclassifier類訓練在HDFS中/class9/20news/bayes-train-input的數據,生成的模型放到/class9/ 20news/newsmodel 目錄中:
mahout trainclassifier \
-i /class9/20news/bayes-train-input \
-o /class9/20news/newsmodel \
-type cbayes \
-ng 2 \
-source hdfs
4.2.6 觀察訓練作業運行過程
注:實驗樓為命令行界面,無法觀測到該步驟界面,以下描述僅做參考
在訓練過程中在JobTracker頁面觀察運行情況,鏈接地址為http://**.***.**.***:50030/jobtracker.jsp,訓練任務四個作業,大概運行了15分鐘左右:
點擊查看具體作業信息
map運行情況
作業運行情況
4.2.7 查看生成模型
通過如下命令查看模型內容:
hadoop fs -ls /class9/20news
hadoop fs -ls /class9/20news/newsmodel
hadoop fs -ls /class9/20news/newsmodel/trainer-tfIdf
4.2.8 測試貝葉斯分類器
使用testclassifier類訓練在HDFS中./20news/bayestest-input的數據,使用的模型路徑為./ 20news/newsmodel:
mahout testclassifier \
-m /class9/20news/newsmodel \
-d /class9/20news/bayes-test-input \
-type cbayes \
-ng 2 \
-source hdfs \
-method mapreduce
4.2.9 觀察訓練作業運行過程
注:實驗樓為命令行界面,無法觀測到該步驟界面,以下描述僅做參考
在執行過程中在JobTracker頁面觀察運行情況,鏈接地址為http://hadoop:50030/jobtracker.jsp,訓練任務1個作業,大概運行了5分鐘左右:
作業的基本信息
map運行情況
reduce運行情況
4.2.10 查看結果
這個混合矩陣的意思說明:上述a到u分別是代表了有20類別,這就是我們之前給的20個輸入文件,列中的數據說明每個類別中被分配到的字節個數,classified說明應該被分配到的總數
381 0 0 0 0 9 1 0 0 0 1 0 0 2 0 1 0 0 3 0 0 | 398 a = rec.motorcycles
意思為rec.motorcycles 本來是屬于 a,有381篇文檔被劃為了a類,這個是正確的數據,其它的分別表示劃到 b~u類中的數目。我們可以看到其正確率為 381/398=0.9573 ,可見其正確率還是很高的了。
4.3 實現過程(mahout 0.7+版本)
在0.7版本的安裝目錄下$MAHOUT_HOME/examples/bin下有個腳本文件classifu-20newsgroups.sh,這個腳本中執行過程是和前面分布執行結果是一致的,只不過將各個API用shell腳本封裝到一起了。從0.7版本開始,Mahout移除了命令行調用的API:prepare20newsgroups、trainclassifier和testclassifier,只能通過shell腳本執行。
執行 $MAHOUT_HOME/examples/bin/classify-20newsgroups.sh 四個選項中選擇第一個選項,
執行結果如下:
5、問題解決
5.1 使用mahout0.7+版本對20Newsgroup數據建立訓練集時出錯
使用如下命令對20Newsgroupt數據建立訓練集時:
mahout org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups \
-p /app/mahout-0.9/data/20news-bydate-train \
-o /app/mahout-0.9/data/bayes-train-input \
-a org.apache.mahout.vectorizer.DefaultAnalyzer\
-c UTF-8
出現如下錯誤,原因在于從0.7版本開始,Mahout移除了命令行調用的prepare20newsgroups、trainclassifier和testclassifier API,只能通過shell腳本執行$MAHOUT_HOME/examples/bin/classify-20newsgroups.sh進行
14/12/7 21:31:35 WARN driver.MahoutDriver: Unable to add class: org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups
14/12/7 21:31:35 WARN driver.MahoutDriver: No org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups.props found on classpath, will use command-line arguments only
Unknown program 'org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups' chosen.
Valid program names are:
arff.vector: : Generate Vectors from an ARFF file or directory
baumwelch: : Baum-Welch algorithm for unsupervised HMM training
.......






























浙公網安備 33010602011771號