MacにMahout環境構築

Hadoop環境を整えたら、機械学習好きとしては、Mahoutを試してみたいですよね。
やっちゃいましょう!

Hadoopの設定などはこちらでも参考にしてみてください。

本家サイトを見れば簡単、かと思いきや、いくつか落とし穴がありました。
Apache Mahout: Scalable machine learning and data mining

mavenのインストール

(mavenの説明入れたい。mvn compileとmvn installのところ)
いつも通りにmacportsでインストール

$port search mavenmaven @1.0.2 (java, devel)

    A java-based build and project management environment.

maven-ant-tasks @2.0.10 (devel, java)
    Use many of Maven's artifact handling features from Ant.

maven2 @2.2.1 (java, devel)
    A java-based build and project management environment.

maven3 @3.0.3 (java, devel)
    A java-based build and project management environment.

maven_select @0.3 (sysutils)
    Switch the default Maven java build tool

無事mavenmacportsで入れられそうです。
mahoutを導入するには、2.0.11以上のmavenが必要らしいので、
今回はmaven2を入れるとします。

$sudo port install maven2$mvn -v
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
Apache Maven 2.2.0 (r788681; 2009-06-26 22:04:01+0900)
Java version: 1.6.0_17
Java home: /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x" version: "10.6.6" arch: "x86_64" Family: "mac"

入りました。

Mahoutのソースコードを取得から設定まで。

$svn co http://svn.apache.org/repos/asf/mahout/trunk
$mv trunc mahout

mahoutのディレクトリがある場所を$MAHOUT_HOMEとして環境変数に設定します。

$cd $MAHOUT_HOME
$mvn install
$cd $MAHOUT_HOME/core
$mvn compile
$mvn install
$cd $MAHOUT_HOME/example
$mvn compile

さあ、Mahoutがコンパイルされました。
まずは、クラスタリングのサンプルを試してみます。

サンプルデータを取得してきます。

$mkdir $MAHOUT_HOME/data
$cd $MAHOUT_HOME/data
$wget http://archive.ics.uci.edu/ml/databases/synthetic_control/synthetic_control.data

Hadoopを起動します。今回は疑似分散モードで動かします。

$ $HADOOP_HOME/bin/start-all.sh

HDFS上のファイルを確認します。

$ $HADOOP_HOME/bin/hadoop fs -lsr

当然ながら、何もありません。
先ほど取得したデータをローカルからHDFS上に移動します。

まずは、HDFS上にデータ用のディレクトリを作成します。

$ $HADOOP_HOME/bin/hadoop fs -mkdir testdata

HDFS上にファイルをセットします。

$ $HADOOP_HOME/bin/hadoop fs -put $MAHOUT_HOME/data/synthetic_control.data testdata

確認します。

$ $HADOOP_HOME/bin/hadoop fs -lsr
drwxr-xr-x   - hadoop supergroup          0 2011-04-29 22:28 /user/hadoop/testdata
-rw-r--r--   2 hadoop supergroup     288374 2011-04-29 22:28 /user/hadoop/testdata/synthetic_control.data

HDFS上にファイルが保存されています。

さて、いよいよMahoutによるクラスタリングの第一歩です。

$ cd $MAHOUT_HOME
$ mvn clean install

ここで、システムリソースが足りない、と怒られてmavenが死ぬ現象が発生!
そんなに貧弱なマシンではないはずなので、Java側の問題だと思うけれど、どこをいじればよいかがよく分からずイライラ。
JVMのメモリを強制的に(?)増やす作戦に!
.bashrcなどに

export _JAVA_OPTIONS="-Dfile.encoding=UTF-8 -Xmx1024m -Xms512m"

を追加。ついでに文字コードUTF-8に変えています。
この設定が適切なのかは今のところ不明ですが、とにかくこれで、mavenは死なずに動くようになりました。

ようやくMahoutにたどり着きました。
どきどきしながらいよいよ実行です。

$MAHOUT_HOME/bin/mahout org.apache.mahout.clustering.syntheticcontrol.canopy.Job

うまく動かない

$MAHOUT_HOME/bin/mahout

だけを実行してみると、$HADOOP_HOMEと$HADOOP_CONF_DIRが設定されていないと怒られているようです。

早速~/.bashrcなどに設定する。

$HADOOP_HOME=/usr/local/hadoop
$HADOOP_CONF_DIR=$HADOOP_HOME/conf


再トライです。とりあえず、canopyを試します。

$MAHOUT_HOME/bin/mahout org.apache.mahout.clustering.syntheticcontrol.canopy.Job

色々ログがはかれてながら動きました!

結果の確認(HDFS上の結果を確認)です。

$HADOOP_HOME/bin/hadoop fs -lsr output

ここからが大きな落とし穴

クラスタリング結果をローカルに持ってきます。

$HADOOP_HOME/bin/hadoop fs -get output $MAHOUT_HOME/examples

取得してきた結果ですが、なぜかバイナリで見れません・・・orz

いろいろと調べてclusterdumpを利用して、テキストファイルに変換する必要がありそうだということが判明しました。
Apache Mahout: Scalable machine learning and data mining
Apache Mahout: Scalable machine learning and data mining

$MAHOUT_HOME/bin/mahout clusterdump --seqFileDir output/clusters-0 --pointsDir output/clusteredPoints --output $MAHOUT_HOME/examples/output/clusteranalyze.txt

とすると、clusteranalyze.txtというテキストファイルができて中身が確認できるようになります。
HDFSから出力結果をローカルに落とし、--seqFileDirと--pointsDirをHDFSではなく、ローカルを指すことでも対応可能です。
明示的に絶対パスを指定しない場合は、HDFS上のパスになっているようです。

さて、これで無事にMahoutが動きました!これから分散環境での機会学習のわっふるわっふるな生活が待っていますね!
とりあえず片っ端からサンプルを試していきたいと思います。

Ubuntuでは簡単に進められたMavenによるコンパイル・インストール関係がMacではこけたり、本家のチュートリアルに従っていると結果がバイナリで吐かれて??となります。
まだまだ日本語によるまとまった情報はないイメージですので、こつこつ書き貯めて行きたいと思います。

Hadoop
HadoopTom White 玉川 竜司

オライリージャパン 2010-01-25
売り上げランキング : 65479


Amazonで詳しく見る
by G-Tools

ちなみに

出力結果のフォーマットは、

のようです。

where CL-0 is the Cluster 0 and n=116 refers to the number of points observed by this cluster and c = [29.922 ...] refers to the center of Cluster as a vector and r = [3.463 ..] refers to the radius of the cluster as a vector.
Apache Mahout: Scalable machine learning and data mining

より。