Apache Mahout

資料分析 Mahout 處理 (1)

基本介紹

教學目標

學習如何在一小時之內輕鬆部署 Hadoop On Google Compute Engine 環境,並且透過 Apache Mahout 進行電影推薦分析。

使用教學

環境部署

  1. 在 Google Cloud Platform 點擊部署 Hadoop On Google Compute Engine 雲端服務,選取一項專案,再按下繼續按鈕。
  2. 根據處理的需求設定 Worker Node 的數量。
  3. 選擇 Google Storage 中的值區 (Bucket),直接當成 Hadoop 檔案伺服器 (HDFS)。
  4. 選擇 Hadoop 版本,目前有提供 1.2.x 和 2.4.1 的版本。( Apache Mahout 推薦分析目前僅支援 1.2.x )
  5. 選擇 Master Node 和 Worker Node 的磁碟類型 (標準或 SSD) 和大小 (GB)。
  6. 勾選安裝 Apache Spark ,以及在進階選項針對需求分配機器類型和網路。
  7. 確認之後按下 Deploy Cluster 按鈕即可以開始花費 3 分鐘至 10 分鐘自動部署叢集。

套件安裝

  1. 開啟 Google 開發人員介面,點掔專案,接著選擇「運算」->「Compute Engine」->「VM 執行個體」。
  2. 選擇 Master Node 進行連接,其中有許多不同的方式,像是 SSH 、 gcloud 和在瀏覽器視窗開啟等方式。
  3. 輸入「hadoop fs -ls .」查詢 HDFS 中的資料夾和檔案,相當於 Google Storage 中的值區資料,接著安裝 Apache Mahout 套件。
1
2
3
4
5
6
7
8
9
10
$ sudo wget http://apache.osuosl.org/mahout/0.9/mahout-distribution-0.9.tar.gz
$ sudo tar zxvf mahout-distribution-0.9.tar.gz
$ cd mahout-distribution-0.9
$ pwd

請複製 Apache Mahout 的目錄路徑。

$ export MAHOUT_HOME=目錄路徑
$ export PATH=$MAHOUT_HOME/bin:$PATH
$ export MAHOUT_LOCAL=

資料分析

下載電影評分原始資料,透過 Linux 指令進行資料轉換的處理之後放置 HDFS (Google Storage) 中。

1
2
3
4
5
6
$ cd ..
$ wget http://files.grouplens.org/datasets/movielens/ml-1m.zip
$ sudo apt-get install unzip
$ unzip ml-1m.zip
$ cat ml-1m/ratings.dat | sed 's/::/,/g' | cut -f1-3 -d, > ratings.csv
$ hadoop fs -put ratings.csv /ratings.csv

接著透過 Apache Mahout 將轉換之後的電影評分原始資料進行推薦分析。

1
$ mahout recommenditembased --input /ratings.csv --output recommendations --numRecommendations 10 --outputPathForSimilarityMatrix similarity-matrix --similarityClassname SIMILARITY_COSINE

(註: 透過設置二台 n1-standard-2 類型實體機器整體花費時間為十三分鐘,比起 Amazon EMR 設置三台 m1.medium 類型實體機器整體花費時間為二十分鐘,Hadoop On Google Compute Engine 資料處理分析更有效率。)

最後檢查電影推薦分析之後的結果。

1
2
$ hadoop fs -ls recommendations
$ hadoop fs -cat recommendations/part-r-00000 | head

輸出結果:

1
2
3
4
5
6
7
8
9
10
11
12
14/12/20 17:53:27 INFO gcs.GoogleHadoopFileSystemBase: GHFS version: 1.2.9-hadoop1
8 [2966:5.0,3793:5.0,3148:5.0,3614:5.0,1805:5.0,2046:5.0,914:5.0,3007:5.0,1958:5.0,1407:5.0]
16 [2003:5.0,3113:5.0,2734:5.0,2470:5.0,2709:5.0,2336:5.0,1091:5.0,3526:5.0,2333:5.0,673:5.0]
24 [3507:5.0,32:5.0,3148:5.0,1805:5.0,2735:5.0,1096:5.0,474:5.0,838:5.0,3260:5.0,1256:5.0]
32 [916:5.0,1238:5.0,2302:5.0,1777:5.0,2312:5.0,2065:5.0,902:5.0,2150:5.0,1295:5.0,141:5.0]
40 [2478:5.0,3526:5.0,3740:5.0,368:5.0,1129:5.0,3435:5.0,1212:5.0,1946:5.0,928:5.0,60:5.0]
48 [3793:5.0,32:5.0,3260:5.0,2046:5.0,3507:5.0,1407:5.0,474:5.0,2616:5.0,1805:5.0,1256:5.0]
56 [2133:5.0,373:5.0,3108:5.0,1358:5.0,805:5.0,3949:5.0,1914:5.0,1678:5.0,2541:5.0,368:5.0]
64 [1339:5.0,849:5.0,1373:5.0,1748:5.0,1037:5.0,3033:5.0,3552:5.0,1690:5.0,1387:5.0,1358:5.0]
72 [1734:5.0,1271:5.0,3552:5.0,368:5.0,1358:5.0,2273:5.0,515:5.0,2915:5.0,3072:5.0,3545:5.0]
80 [3755:5.0,47:5.0,3108:5.0,2133:5.0,805:5.0,1231:5.0,832:5.0,1678:5.0,1358:5.0,2366:5.0]
cat: Unable to write to output stream.

刪除環境

在 Google Cloud Platform 點擊部署 Hadoop On Google Compute Engine 雲端服務,選取專案,再按下 Delete cluster 按鈕。(註: 整個部署分析的流程可以控制在一個小時之內解決,同時輸入和輸出的資料會在 Google Storage 中永久保存。)

相關資源

雲端服務 Amazon Web Service (2)

基本介紹

教學目標

學會如何根據大數據處理階段,選擇最適合的 Amazon 雲端服務。

重點概念

Big Data Portfolio of Services

在大數據處理的階段根據下表,就能在篩選出最適合的 Amazon 雲端服務。

處理階段 雲端服務
收集 AWS Direct Connect、AWS Import/Export、Amazon Kinesis
儲存 Amazon S3、Amazon DynamoDB、Amazon Glacier
處理 & 分析 Amazon Redshift 、Amazon EMR、Amazon EC2

(參考資源: AWS re:Invent 2014 | (BDT303) Construct ETL Pipeline w/ AWS Data Pipeline, Amazon EMR & Redshift )

Batch Processing

Amazon EMR 雲端服務搭配 Apache Mahout 開源專案進行資料分析處理。

Amazon EMR 雲端服務搭配 Apache Spark 開源專案進行資料分析處理。

Real-time Processing

Amazon Kinesis 雲端服務搭配 Amazon Redshift 雲端服務進行資料分析處理。

Amazon Kinesis 雲端服務搭配 Storm 開源專案進行資料分析處理。

相關資源

Node.js 雲端服務 Amazon (5)

基本介紹

教學目標

透過 Node.js 搭配 Amazon Elastic MapReduce 建立簡易的電影推薦 API 之應用。

前置作業

  1. 申請 AWS 雲端服務帳號。
  2. 建立 Amazon Elastic MapReduce 的叢集服務。

使用教學

推薦分析

在 Amazon Elastic MapReduce 中的 Cluster Details 就能找到 SSH 的登入方式。

登入 Amazon Elastic MapReduce 的主要伺服器

1
$ ssh hadoop@ec2-54-169-107-189.ap-southeast-1.compute.amazonaws.com -i ~/leoyehme.pem

下載範例檔案,並且解壓縮該檔案。

1
2
$ wget http://files.grouplens.org/datasets/movielens/ml-1m.zip
$ unzip ml-1m.zip

進行範例檔案內容的處理,以進行接下來的推薦分析。

1
$ cat ml-1m/ratings.dat | sed 's/::/,/g' | cut -f1-3 -d, > ratings.csv

將本機檔案放置 Hadoop 檔案系統之中。

1
$ hadoop fs -put ratings.csv /ratings.csv

開始透過 Apache Mahout 和 Amazon Elastic MapReduce 進行推薦分析

1
$ mahout recommenditembased --input /ratings.csv --output recommendations --numRecommendations 10 --outputPathForSimilarityMatrix similarity-matrix --similarityClassname SIMILARITY_COSINE

當我們透過三台 m1.medium 等級的 EC2 進行 Hadoop + Mahout 資料解析需要花費二十分鐘左右。

檢查推薦分析之後的結果。

1
2
$ hadoop fs -ls recommendations
$ hadoop fs -cat recommendations/part-r-00000 | head

安裝 Node.js

開始進行安裝。

1
2
3
4
5
6
$ sudo yum update
$ sudo yum install gcc-c++ make
$ sudo yum install openssl-devel
$ sudo yum install git
$ git clone git://github.com/joyent/node.git
$ git checkout v0.8.1 ./configure make sudo make install

修改執行檔的路徑。

1
2
3
$ sudo vi /etc/sudoers

Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

繼續安裝 NPM。

1
2
3
$ git clone https://github.com/isaacs/npm.git
$ cd npm
$ sudo make install

升級 Node.js 為穩定版本

1
2
3
$ sudo npm install n -g
$ sudo n stable
$ node -v

安裝相關套件

1
$ npm install express --save

實作推薦 API

透過 vi 工具撰寫推薦 API 程式碼

1
$ vi server.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var express = require('express');
var app = express();
var router = express.Router();
app.use('/api', router);
router.get('/movie/:id', function(req, res){
var exec = require('child_process').exec;
exec("hadoop fs -cat recommendations/part*", function(error, stdout, stderr){
var result = stdout.split("\n");
result.forEach(function(element, index, arr) {
var data = element.split("\t");
var key = data[0];
var value = data[1];
if (req.params.id == key) {
res.json({data:value});
}
});
});
});
var port = process.env.PORT || 8080;
app.listen(port);

修改 EC2 的 Security Groups 中的 ElasticMapReduce-master 的 Inbound

1
2
3
4
5
Custom TCP Rule
TCP
8080
Anywhere
0.0.0.0/0

啟動推薦 API 伺服器

1
$ node server.js

在瀏覽器網址列輸入 http://ec2-54-169-107-189.ap-southeast-1.compute.amazonaws.com:8080/api/movie/37

1
{"data":"[1231:5.0,237:5.0,2133:5.0,3844:5.0,2478:5.0,1688:5.0,832:5.0,3108:5.0,1946:5.0,224:5.0]"}

推薦 API 優化

將每次存取 Hadoop 檔案系統中的檔案匯出至本機,接著再被推薦 API 進行存取。

1
hadoop fs -cat recommendations/part* > result.csv

將每次存取本機檔案的結果儲存至陣列變數中,接著再下次推薦 API 被存取時就能先取陣列的內容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var express = require('express');
var app = express();
var router = express.Router();
app.use('/api', router);
var cache = new Array();
router.get('/movie/:id', function(req, res){
if (cache[req.params.id]) {
res.json({data:cache[req.params.id]});
} else {
var fs = require('fs');
var path = require('path');
var filePath = path.join(__dirname, 'result.csv');
fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
if (!err) {
var result = data.split("\n");
result.forEach(function(element, index, arr) {
var data = element.split("\t");
var key = data[0];
var value = data[1];
cache[key] = value;
if (req.params.id == key) {
res.json({data:value});
}
});
} else {
console.log(err);
}
});
}
});
var port = process.env.PORT || 8080;
app.listen(port);

啟動推薦 API 伺服器

1
$ node server.js

在瀏覽器網址列輸入 http://ec2-54-169-107-189.ap-southeast-1.compute.amazonaws.com:8080/api/movie/37。

1
{"data":"[1231:5.0,237:5.0,2133:5.0,3844:5.0,2478:5.0,1688:5.0,832:5.0,3108:5.0,1946:5.0,224:5.0]"}

重複存取推薦 API 多次,將會發現回應時間比未優化之前快非常多。

相關資源