Hadoop第10周練習—Mahout部署及進行20newsgroup數據分析例子
1 運行環境說明
1.1 硬軟件環境
1.2 機器網絡環境
2 書面作業0:搭建Mahout環境
2.1 Mahout介紹
2.2 部署過程
2.2.1 下載Mahout
2.2.2 上傳Mahout
2.2.3 解壓縮
2.2.4 設置環境變量
2.2.5 驗證安裝完成
2.3 測試例子
2.3.1 下載測試數據,放到$MAHOUT_HOME/testdata目錄
2.3.2 啟動Hadoop
2.3.3 使用kmeans算法
2.3.4 查看結果
3 書面作業1:運行20newsgroup
3.1 書面作業1內容
3.2 算法流程
3.3 實現過程(mahout 0.6版本)
3.3.1 下載數據
3.3.2 上傳并解壓數據
3.3.3 建立訓練集
3.3.4 建立測試集
3.3.5 上傳數據到HDFS
3.3.6 訓練貝葉斯分類器
3.3.7 觀察訓練作業運行過程
3.3.8 查看生成模型
3.3.9 測試貝葉斯分類器
3.3.10觀察訓練作業運行過程
3.3.11查看結果
3.4 實現過程(mahout 0.7+版本)
4 問題解決
4.1 使用mahout0.7+版本對20Newsgroup數據建立訓練集時出錯
1 運行環境說明
1.1 硬軟件環境
l 主機操作系統:Windows 64 bit,雙核4線程,主頻2.2G,6G內存
l 虛擬軟件:VMware? Workstation 9.0.0 build-812388
l 虛擬機操作系統:CentOS 64位,單核,1G內存
l JDK:1.7.0_55 64 bit
l Hadoop:1.1.2
1.2 機器網絡環境
集群包含三個節點:1個namenode、2個datanode,其中節點之間可以相互ping通。節點IP地址和主機名分布如下:
|
序號 |
機器名 |
類型 |
用戶名 |
運行進程 |
|
|
1 |
10.88.147.221 |
hadoop1 |
名稱節點 |
hadoop |
NN、SNN、JobTracer |
|
2 |
10.88.147.222 |
hadoop2 |
數據節點 |
hadoop |
DN、TaskTracer |
|
3 |
10.88.147.223 |
hadoop3 |
數據節點 |
hadoop |
DN、TaskTracer |
所有節點均是CentOS6.5 64bit系統,防火墻均禁用,所有節點上均創建了一個hadoop用戶,用戶主目錄是/usr/hadoop。所有節點上均創建了一個目錄/usr/local/hadoop,并且擁有者是hadoop用戶。
2 書面作業0:搭建Mahout環境
2.1 Mahout介紹
Mahout 是 Apache Software Foundation(ASF) 旗下的一個開源項目,提供一些可擴展的機器學習領域經典算法的實現,旨在幫助開發人員更加方便快捷地創建智能應用程序。AMahout包含許多實現,包括聚類、分類、推薦過濾、頻繁子項挖掘。此外,通過使用 Apache Hadoop 庫,Mahout 可以有效地擴展到云中。
2.2 部署過程
2.2.1下載Mahout
在Apache下載最新的Mahout軟件包,點擊下載會推薦最快的鏡像站點,以下為下載地址:http://archive.apache.org/dist/mahout/0.6/
2.2.2上傳Mahout
把下載的mahout-distribution-0.6.tar.gz安裝包,使用SSH Secure File Transfer工具(第1、2作業周2.1.3.1介紹)上傳到/home/hadoop/Downloads 目錄下
2.2.3解壓縮
在Downloads目中將mahout解壓縮
cd /home/hadoop/Downloads/
tar -xzf mahout-distribution-0.6.tar.gz
把mahout-distribution-0.6目錄移到/usr/local目錄下
sudo mv mahout-distribution-0.6 /usr/local/mahout-0.6
cd /usr/local
ls
2.2.4設置環境變量
使用如下命令編輯/etc/profile文件:
sudo vi /etc/profile
聲明mahout的home路徑和在path加入bin的路徑:
export MAHOUT_HOME=/usr/local/mahout-0.6
export MAHOUT_CONF_DIR=/usr/local/mahout-0.6/conf
export PATH=$PATH:$MAHOUT_HOME/bin
編譯配置文件/etc/profile,并確認生效
source /etc/profile
2.2.5驗證安裝完成
重新登錄終端,確保hadoop集群啟動,鍵入mahout --help命令,檢查Mahout是否安裝完好,看是否列出了一些算法:
mahout --help
2.3 測試例子
2.3.1下載測試數據,放到$MAHOUT_HOME/testdata目錄
下載一個文件synthetic_control.data,下載地址http://archive.ics.uci.edu/ml/databases/synthetic_control/synthetic_control.data,并把這個文件放在$MAHOUT_HOME目錄下
cd /home/hadoop/Downloads/
mv synthetic_control.data /usr/local/mahout-0.6/
mkdir testdata
cp synthetic_control.data testdata/
ls
2.3.2啟動Hadoop
./start-all.sh
2.3.3使用kmeans算法
使用如下命令進行kmeans算法測試:
mahout org.apache.mahout.clustering.syntheticcontrol.kmeans.Job
2.3.4查看結果
結果會在根目錄建立output新文件夾,如果下圖結果表示mahout安裝正確且運行正常:
cd output
ls
3 書面作業1:運行20newsgroup
3.1 書面作業1內容
安裝Mahout,并運行20newsgroup的測試樣例,抓圖說明實驗過程
3.2 算法流程
樸素貝葉斯分類是一種十分簡單的分類算法,樸素貝葉斯的思想基礎是這樣的:對于給出的待分類項,求解在此項出現的條件下各個類別出現的概率哪個最大,就認為此待分類項屬于哪個類別。
這二十個新聞組數據集合是收集大約20,000新聞組文檔,均勻的分布在20個不同的集合。這20個新聞組集合采集最近流行的數據集合到文本程序中作為實驗,根據機器學習技術。例如文本分類,文本聚集。我們將使用Mahout的Bayes Classifier創造一個模型,它將一個新文檔分類到這20個新聞組集合范例演示
3.3 實現過程(mahout 0.6版本)
3.3.1下載數據
下載20Newsgroups數據集,地址為 http://qwone.com/~jason/20Newsgroups/ ,下載20news-bydate.tar.gz數據包
3.3.2上傳并解壓數據
把下載的20news-bydate.tar.gz數據包,使用SSH Secure File Transfer工具(第1、2作業周2.1.3.1介紹)上傳到/home/hadoop/Downloads 目錄下:
解壓20news-bydate.tar.gz數據包,解壓后可以看到兩個文件夾,分別為訓練原始數據和測試原始數據:
cd /home/hadoop/Downloads/
tar -xzf 20news-bydate.tar.gz
在mahout根目錄下建data文件夾,然后把20news訓練原始數據和測試原始數據遷移到該文件夾下:
mkdir /usr/local/mahout-0.6/data
mv 20news-bydate-t* /usr/local/mahout-0.6/data
ls /usr/local/mahout-0.6/data
3.3.3建立訓練集
通過如下命令建立訓練集,訓練的數據在20news-bydate-train目錄中,輸出的訓練集目錄為 bayes-train-input:
mahout org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups \
-p /usr/local/mahout-0.6/data/20news-bydate-train \
-o /usr/local/mahout-0.6/data/bayes-train-input \
-a org.apache.mahout.vectorizer.DefaultAnalyzer \
-c UTF-8
3.3.4建立測試集
通過如下命令建立訓練集,訓練的數據在20news-bydate-test目錄中,輸出的訓練集目錄為 bayes-test-input:
mahout org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups \
-p /usr/local/mahout-0.6/data/20news-bydate-test \
-o /usr/local/mahout-0.6/data/bayes-test-input \
-a org.apache.mahout.vectorizer.DefaultAnalyzer \
-c UTF-8
3.3.5上傳數據到HDFS
在HDFS中新建./20news文件夾,把生成的訓練集和測試集上傳到HDFS的./20news目錄中:
hadoop fs -mkdir ./20news
hadoop fs -put /usr/local/mahout-0.6/data/bayes-train-input ./20news
hadoop fs -put /usr/local/mahout-0.6/data/bayes-test-input ./20news
hadoop fs -ls ./20news
hadoop fs -ls ./ 20news/bayes-test-input
3.3.6訓練貝葉斯分類器
使用trainclassifier類訓練在HDFS中./20news/bayes-train-input的數據,生成的模型放到./ 20news/newsmodel 目錄中:
mahout trainclassifier \
-i /user/hadoop/20news/bayes-train-input \
-o /user/hadoop/20news/newsmodel \
-type cbayes
-ng2 \
-source hdfs
3.3.7觀察訓練作業運行過程
在訓練過程中在JobTracker頁面觀察運行情況,鏈接地址為http://hadoop1:50030/jobtracker.jsp,訓練任務四個作業,大概運行了15分鐘左右:
點擊查看具體作業信息
map運行情況
作業運行情況
3.3.8查看生成模型
通過如下命令查看模型內容:
hadoop fs -ls ./20news
hadoop fs -ls ./20news/newsmodel
hadoop fs -ls ./20news/newsmodel/trainer-tfIdf
3.3.9測試貝葉斯分類器
使用testclassifier類訓練在HDFS中./20news/bayestest-input的數據,使用的模型路徑為./ 20news/newsmodel:
mahout testclassifier \
-m /user/hadoop/20news/newsmodel \
-d /user/hadoop/20news/bayes-test-input \
-type cbayes
-ng2 \
-source hdfs\
-method mapreduce
3.3.10 觀察訓練作業運行過程
在執行過程中在JobTracker頁面觀察運行情況,鏈接地址為http://hadoop1:50030/jobtracker.jsp,訓練任務1個作業,大概運行了5分鐘左右:
作業的基本信息
map運行情況
reduce運行情況
3.3.11 查看結果
這個混合矩陣的意思說明:上述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 ,可見其正確率還是很高的了。
3.4 實現過程(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 四個選項中選擇第一個選項,
4 問題解決
4.1 使用mahout0.7+版本對20Newsgroup數據建立訓練集時出錯
使用如下命令對20Newsgroupt數據建立訓練集時:
mahout org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups \
-p /usr/local/mahout-0.9/data/20news-bydate-train \
-o /usr/local/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
.......
調用shell腳本執行參見3.4



































浙公網安備 33010602011771號