MacでMahoutを使う

| Topic path: Top / 機械学習 / MacでMahoutを使う

*はじめに [#of548cb6]

[[Apache Mahout:http://mahout.apache.org/]]は,分散環境Hadoopの上で動くスケーラブルな機械学習ライブラリーです.

ただし,「Hadoop上でMapReduceを使った機械学習をやりたい」という強い意思がないと,サンプルを動かして終わりになります.
「別にMapReduceでなくてもいい」という人は,別のツールを使ったほうがいいでしょう.

この記事の内容は,Mac OS X 10.6.6, Hadoop 0.20.2, Maven 3.0.2, Mahout 0.40で確認しました.



*必要なもの [#he1838fc]

-Java SE 1.6

Mac OS X 10.6.6には標準でJava SE (JDK) 1.6が入っていると思います.
ユーティリティーにあるJava Preferencesを実行すると,インストールされているJavaのバージョンが確認できます.


*ダウンロード [#f55e60ba]

**Hadoop [#tf54febc]
-Apache Hadoop~
http://hadoop.apache.org/

Hadoop CommonのDownloadにあるDownload a realease now!からミラー・サーバーのリストに行き,その中のどれかから''hadoop-0.20.2.tar.gz''をダウンロードします.

Hadoop 0.21.0上ではMahoutが動きませんでした.
Hadoop 0.20.2にしておきましょう.


**Maven [#n0635ae6]
-Apache Maven~
http://maven.apache.org/

Downloadのところにある''apache-maven-3.0.2-bin.zip''をダウンロードします.
今回はtar.gzがうまくダウンロードできなかったのでzipにしましたが,基本的にはどちらでも同じです.

**Mahout [#id2d258c]
-Apache Mahout~
http://mahout.apache.org/

download mahoutにあるOfficial Releaseからミラー・サーバーのリストに行き,その中のどれかから''mahout-distribution-0.4-src.tar.gz''をダウンロードします.


*Hadoopのインストール [#t93d4728]

まずはダウンロードしたhadoop-0.20.2.tar.gzをダブル・クリックして展開します.

展開したhadoop-0.20.2を/usr/local/に移動します.
また,/usr/local/hadoopというリンクを作成します.
#geshi(bash){{
$ sudo mv hadoop-0.20.2 /usr/local/
$ sudo ln -s /usr/local/hadoop-0.20.2 /usr/local/hadoop
}}

つぎに,環境変数を設定するため,~/.bashrcに次の内容を追加します.
#geshi(bash){{
export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_HOME=/usr/local/hadoop
export PATH=$HADOOP_HOME/bin:$PATH
}}

動作確認します.
#geshi(bash){{
$ hadoop -version
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04-307-10M3261)
Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03-307, mixed mode)
}}


*Mavenのインストール [#jae2d9df]

Apache Mavenはソフトウェア・プロジェクト管理ツールで,Hadoopをビルドするのに必要です.
Apache Mavenはソフトウェア・プロジェクト管理ツールで,Mahoutをビルドするのに必要です.

まず,ダウンロードしたapache-maven-3.0.2-bin.zipをダブル・クリックして展開します.

展開したapache-maven-3.0.2 を/usr/local/に移動します.
また,/usr/local/mavenというリンクを作成します.
#geshi(bash){{
$ sudo mv apache-maven-3.0.2 /usr/local/
$ sudo ln -s /usr/local/apache-maven-3.0.2 /usr/local/maven
}}

つぎに,環境変数を設定します.
Hadoopのときと同様に,~/.bashrcに次の内容を追加します.
#geshi(bash){{
export MAVEN_HOME=/usr/local/maven
export PATH=$MAVEN_HOME/bin:$PATH
}}

動作確認します.
#geshi(bash){{
$ mvn -version
Apache Maven 2.2.1 (r801777; 2009-08-07 04:16:01+0900)
Java version: 1.6.0_22
Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: ja_JP, platform encoding: SJIS
OS name: "mac os x" version: "10.6.6" arch: "x86_64" Family: "mac"
}}


*Mahoutのインストール [#o66e1929]

いよいよApache Mahoutをインストールします.

まず,ダウンロードしたmahout-distribution-0.4-src.tar.gzをダブル・クリックして展開します.

展開したmahout-distribution-0.4を/usr/local/に移動します.
また,/usr/local/mahoutというリンクを作成します.
#geshi(bash){{
$ sudo mv mahout-distribution-0.4 /usr/local
$ sudo ln -s /usr/local/mahout-distribution-0.4 /usr/local/mahout
}}

/usr/local/mahoutディレクトリーへ移動し,Mavenでのインストールを行います.
#geshi(bash){{
$ cd /usr/local/mahout
$ sudo mvn install
}}

この処理にはかなり時間がかかりますので,気長に待ちます.

つづいて,今まで同じように,~/.bashrcに環境変数を設定します.
#geshi(bash){{
export MAHOUT_HOME=/usr/local/mahout
export PATH=$MAHOUT_HOME/bin:$PATH
}}


*Mahoutを使ってみる [#pb6daa87]

Mahoutの実行は,次のような手順になります.
+Hadoopを起動する
+データ・ファイルをHadoop上にコピーする
+Mahoutを実行する
+Mahoutの出力をダンプする
+Hadoopを停止する


**データのダウンロード [#p42041fa]

[[Mahoutのサイト:http://mahout.apache.org/]]にある[[Quickstart:https://cwiki.apache.org/confluence/display/MAHOUT/Quickstart]]をクリックして,例題のリストを表示します.
ここでは,一番上のクラスタリング「Clustering of synthetic control data」を使います.

このデータは,管理図の時系列データを集めたもので,600個のデータに対し時系列を成す60個の説明変数があります.
最初の100個のデータが「正常」,その次の100個のデータが「周期的」,以下同様に「増加トレンド」,「減少トレンド」,「上方シフト」,「下方シフト」となっています.

データ・ファイルをダウンロードし,適当なフォルダーに保存します.


**Hadoopの準備 [#x0a99377]

Hadoopを起動するのに,sshを使います.
そこで,システム環境設定を起動して「共有」をクリックし,「リモートログイン」にチェックを入れておきます.

つぎに,Hadoopを起動します.
#geshi(bash){{
$ $HADOOP_HOME/bin/start-all.sh
}}

何度かログイン用のパスワード入力を求められます.
パスワード入力を省きたい人はssh-agentの設定をしましょう.

また,途中で,JavaのExceptionが発生しますが,原因はわかりません.

Hadoopを起動したら,Hadoopのファイル・システムの上にディレクトリーを作成し,データ・ファイルをMacのファイル・システムからHadoopのファイル・システムにコピーします..
#geshi(bash){{
$ hadoop fs -mkdir testdata
11/02/18 17:36:27 INFO security.Groups: Group mapping impl=org.apache.hadoop.security.ShellBasedUnixGroupsMapping; cacheTimeout=300000
$ hadoop fs -put synthetic_control.data.txt testdata
11/02/18 18:10:00 INFO security.Groups: Group mapping impl=org.apache.hadoop.security.ShellBasedUnixGroupsMapping; cacheTimeout=300000
}}


**Mahoutの実行 [#f99b0006]

ここでは,Mahoutを使ってK-meansクラスタリングを実行します.
その他のクラスタリングの実行については,[[こちら:https://cwiki.apache.org/confluence/display/MAHOUT/Clustering+of+synthetic+control+data]]に載っています.
#geshi(bash){{
$ mahout org.apache.mahout.clustering.syntheticcontrol.kmeans.Job
}}

outputというディレクトリーが作成され,その中に出力されます.
これらのファイルはHadoop用のファイル・システムに書かれたもので,そのままでは読めません.


**結果の確認 [#lee6a72e]

まず,outputディレクトリーに出力されたファイルのリストを確認します.
#geshi(bash){{
$ hadoop fs -lsr output
}}

outputディレクトリーの中にあるClusters-xというのが学習されたクラスターです.

Mahoutのclusterdumpを使って,Clusters-xの中身を書き出します.
ここでは,clusters-0の内容をclusteranalyze-0.txtに書き出します.
#geshi(bash){{
$ mahout clusterdump --seqFileDir output/clusters-0 --pointsDir output/clusteredPoints/ --output output/clusteranalyze-0.txt
}}

出力されたファイルの1行目はこんな感じです.
#geshi(text){{
C-0{n=21 c=[29.552, 33.073, 35.876, 36.375, 35.118, 32.761, 29.566, 26.983, 25.272, 24.967, 25.691, 28.252, 30.994, 33.088, 34.015, 34.349, 32.826, 31.053, 29.116, 27.975, 27.879, 28.103, 28.775, 30.585, 31.049, 31.652, 31.956, 31.278, 30.719, 29.901, 29.545, 30.207, 30.672, 31.366, 31.032, 31.567, 30.610, 30.204, 29.266, 29.753, 29.296, 29.930, 31.207, 31.191, 31.474, 32.154, 31.746, 30.771, 30.250, 29.807, 29.543, 29.397, 29.838, 30.489, 30.705, 31.503, 31.360, 30.827, 30.426, 30.399] r=[0.979, 3.352, 5.334, 5.851, 4.868, 3.000, 3.376, 4.812, 5.159, 5.596, 4.940, 4.793, 5.415, 5.014, 5.155, 4.262, 4.891, 5.475, 6.626, 5.691, 5.240, 4.385, 5.767, 7.035, 6.238, 6.349, 5.587, 6.006, 6.282, 7.483, 6.872, 6.952, 7.374, 8.077, 8.676, 8.636, 8.697, 9.066, 9.835, 10.148, 10.091, 10.175, 9.929, 10.241, 9.824, 10.128, 10.595, 9.799, 10.306, 10.036, 10.069, 10.058, 10.008, 10.335, 10.160, 10.249, 10.222, 10.081, 10.274, 10.145]}
}}

クラスター0(C-0)は,21個のデータを参照していて,そのクラスターの中心は[29.552, 33.073, ...]だという意味です.


**Hadoopの終了 [#y708acdb]

最後に,Hadoopを終了します.
#geshi(bash){{
$ $HADOOP_HOME/bin/stop-all.sh
}}


*コメント [#oad62fb0]

用意されたサンプルではなく自分のデータに対してMahoutを使うには,Jobファイルをビルドする必要があります.

残念ながら,ちょっと試してみるというわけにはいかないようです.

Jobファイル作りに挑戦するのは,またいつか.


*参考情報 [#qb4469d4]
-[[Mahoutの開発環境をMaven+Eclipseで作る (1):http://d.hatena.ne.jp/n_shuyo/20110131/mahout]] | Mi manca qualche giovedi`?
-[[Mahoutの開発環境をMaven+Eclipseで作る (2) Hadoopセットアップ:http://d.hatena.ne.jp/n_shuyo/20110208/hadoop]] | Mi manca qualche giovedi`?
-[[Mahoutの開発環境をMaven+Eclipseで作る (3) EclipseでHadoopの開発環境を作る:http://d.hatena.ne.jp/n_shuyo/20110218/hadoop]] | Mi manca qualche giovedi`?
-[[MacでMadoop (MapReduce):http://blog.suz-lab.com/2010/01/machadoopmap-reduce.html]] | suz-lab
-[[Mahoutを試してみた:http://blog.suz-lab.com/2010/01/mahout.html]] | suz-lab
トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS