Mahout の開発環境を Maven+Eclipse で作る (1)

Mahout in Action 買ったんだけど、開発環境の作り方についてはほとんど何も書いてない。いや、それも大事なことだと思うぞ。
というわけで、Mahout 用の開発環境をちょっとまじめに作ってみた。
とりあえず今回は Mahout in Action のサンプルコードを Eclipse 上で動かすところまで。

いろいろインストール

必要なものをインストール。今回入れたのはこんな感じ。それぞれの入れ方は略。まあ JAVA_HOME を設定して、パスを通すぐらい。
OS が Windows 2008 x64 なので、JavaEclipse は x64 版を入れている。


Cygwin は Mahout が DOS 窓からでは満足に使えないため。まあ Hadoop が tar.gz 配布なので、それを展開するのにも使える(他はインストーラか zip がある)。
Hadoop は今回はまだ使わないけど、一応。


追記
JavaSDK は Program Files 以外のディレクトリにインストールすること。インストールディレクトリパスにスペースが入っていると、Hadoop 0.20 以降は動かない。
Hadoop は 0.20.2 推奨。Mahout 0.4 および 0.5-SNAPSHOT がそのバージョンに対応していることと、0.21 は他にもいろいろ問題があって、普通に使わない方がいいレベル。
【/追記

Maven

正直、Maven は苦手。なんか必要以上に複雑な印象がが。
とりあえず今回必要な範囲は、"Maven Getting Started Guide" と "Guide to using Eclipse with Maven 2.x" を読んでおけばいい感じ。


ポイントは Maven 3 でも Maven 2 Repository ってところ。


ちなみに "Maven Getting Started Guide" は Maven の Document のインデックスページには "Getting Started in 30 Minutes" と書かれている。30分でわかる Maven …… 30分で読める分量ではないんだが(苦笑)。

Mahout

Eclipse から Mahout のソースを見ながら開発できるようにソース版を入れる。バイナリは多分次回。
まずは Mahout のダウンロードページまたはソースのリポジトリからソース一式を取ってくる。


現在の最新は 0.4 もしくは 0.5 SNAPSHOT。手元では 0.4 の方を入れた。
でもあとで出てくるように、実際に Mahout のインターフェースはどんどん変わっていっているようなので、0.5 を使った方がいいのかも?


ソースを展開する前に、Eclipse を起動してどこか適当な場所にワークスペースを作っておこう。とりあえず今回 C:\Users\shuyo\workspace に作ったとする。デフォルトかい! というツッコミは無し。
ワークスペースディレクトリで Mahout のソースを展開する。展開先は C:\Users\shuyo\workspace\mahout-distribution-0.4 とする。
別の場所でもいいはずなんだけど、あちこちばらばらにするよりこっちのほうがわかりやすいかな、と。


そして Dos 窓か Cygwin を開いて、C:\Users\shuyo\workspace\mahout-distribution-0.4 に移動し、Maven プロジェクトを Eclipse プロジェクトに変換する以下のコマンドを実行する。
初回の Maven 実行だと、プラグインを大量にダウンロードしまくるのでちょっと時間かかる。

$ mvn eclipse:eclipse


これによりローカルの Maven 2 Repository も作成されるので、これを Eclipseclasspath variable M2_REPO に設定する。http://maven.apache.org/guides/mini/guide-ide-eclipse.html やいろんな説明ブログ類には、以下のコマンドを叩くように書いてある。

$ mvn -Declipse.workspace=<path-to-eclipse-workspace> eclipse:add-maven-repo


が、http://maven.apache.org/guides/mini/guide-ide-eclipse.html には続けて "Issue: The command does not work." と書いてある。むー?
というわけで、コマンドを使わずに M2_REPO を設定する方法を書いておこう。
これは Eclipseワークスペースに対して行う設定なので、一回しておけばそのワークスペースではもう設定する必要はない。


http://giovedi.net/img/mahout/mahout1.png


この M2_REPO の登録を忘れて続く作業を行うと、以下のようなエラーが出る。

The project cannot be built until build path errors are resolved
Unbound classpath variable: 'M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar' in project '********'


M2_REPO の設定をすれば消えるので大丈夫。


あとは変換された Mahout の Eclipse プロジェクトをインポートすればいい。
C:\Users\shuyo\workspace\mahout-distribution-0.4\ に Eclipse 用の .project と .classpath が生成されていることを確認し、Eclipse のメニューから File > Import > General > Existing Projects into Workspace で C:\Users\shuyo\workspace\mahout-distribution-0.4\ をインポートする。


http://giovedi.net/img/mahout/mahout2.png


画像はすでにインポート済みなのでグレイアウトしているが、とりあえずこんな感じで7つのプロジェクトが選べるので、全部選んでインポートしよう。


ちなみに mvn eclipse:eclipseEclipse の m2eclipse プラグインをサポートしていないらしいので、そのプラグインを使いたい人は他の手法を使う必要があるかも。

Mahout in Action のサンプルコード

"Mahout in Action" は Manning 社の Mahout 解説本だけど、まだ発売されていない。今は Early Access Edition がダウンロード販売されている。2週間前くらいまでは $27.5 だったんだけど、今は $34.99 になってるな……


このページで2〜6章のサンプルコードも公開されているので、それをダウンロード。
展開するのはちょっと待って。


先にサンプルコード用の Maven/Eclipse プロジェクトを作る。
ワークスペースディレクトリで以下のコマンドを叩く。

mvn archetype:create -DgroupId=mia.recommender -DartifactId=recommender


これが Maven のプロジェクトを生成するコマンド。
archetype というのは Maven プロジェクトの雛形を指す名称。詳しくは Maven Archetype – About とか。
groupId とは、"Maven Getting Started Guide" には "the unique identifier of the organization or group that created the project" であり "one of the key identifiers of a project" である、という若干矛盾がちな説明が書かれている。どっちやねん。とりあえずルートパッケージ名を付けておくもんらしい。
artifact はプロジェクトの成果物で、生成する jar ファイルの名前などに使われる。


このコマンドを実行すると、Hello World なスケルトンコードを持つプロジェクト recommender が生成される。
という説明を書きながら mia-sample とかの方が良かったかな、と思ってしまった。まあ、いいか。


後は以下のように。

  • recommender/src/main/java/mia/recommender 以下に、先ほどダウンロードしたサンプルコードを展開して出来た ch02〜ch06 をコピーする。スケルトンコードの App.java は消しても良い
  • recommender に移動して、mvn eclipse:eclipse を叩き、Eclipse プロジェクトに変換
  • recommender を Eclipse にインポートする


これでサンプルコードを取り込んだ recommender プロジェクトが出来たが、まだ Mahout のライブラリが参照できていないのでソースが真っ赤っかである。


http://giovedi.net/img/mahout/mahout3.png


recommender プロジェクトを右クリックし、Properties > Java Build Path > Projects を選び、Add を押して次の3つのプロジェクトを選ぶ。

  • mahout-core
  • mahout-examples
  • mahout-taste-webapp


http://giovedi.net/img/mahout/mahout4.png


これで Mahout を参照するようになって、エラーのほとんどは解消される。が、まだ4つほど残る(2011/1 現在)。


http://giovedi.net/img/mahout/mahout5.png


これはおそらく Mahout のバージョンアップによりインターフェースが変わったが、サンプルコードがまだそれに追随していないためなので、コードを修正する必要がある。が、ここまでできていればマウスでクリックするだけで修正できる。
例えば mia.recommender.ch03.IREvaluatorBooleanPrefIntro2 なら、コードの赤くなっている場所にカーソルを持って行き、ctrl+1 を押すと次のように表示される。つまり、NearestNUserNeighborhood のコンストラクタが投げる TasteException を catch も宣言もしていないというエラーなので、2つ表示されている解決法の内お好みの方を選べばいい。"Add throws declaration" を選べば、その関数に throws TasteException 宣言が追加され、エラーが解消される。残りの3つも同様。


http://giovedi.net/img/mahout/mahout6.png


まあこの程度ならわざわざソースを取り込まなくてもライブラリを参照するだけでもできちゃうんだけど、Mahout はドキュメントがまだまだ未整備、今後も仕様がどんどん変わっていく、となるとソースを参照するケースが必然的に多くなるだろうから、Eclipse の中で F3 を押すだけでカーソル位置から呼び出している Mahout のソースが参照できるようにしておくのは非常に有益だろう。


あとはサンプルコードを実行してみるだけだ。
試しに mia.recommender.ch02.RecommenderIntro を選んで、メニューの Run > Run を選ぶ(ctrl+F11)。すると実行はされるが、ファイルが見つからないというエラーになる。
サンプルデータが mia/recommender/ch02 にあるのでこれを読み込ませてあげよう。今度はメニューの Run > Run Configurations を選ぶ。先ほど一度 Run させておいたおかげで、RecommenderIntro を実行するための configuration ができあがっているので、Arguments タブを選び、Working directory に mia/recommender/ch02 を設定してあげる。"Workspace..." ボタンを押せばダイアログが出るので、そこで選べばいい。


http://giovedi.net/img/mahout/mahout7.png


これで再度実行すれば、今度はちゃんと Mahout のリコメンドを呼び出したような結果が Eclipse の console に出力される。


自分で好きなコードを書きたいときは Maven のプロジェクトを作るところから繰り返せばOK。必要に応じて Mahout のプロジェクトを Properties > Java Build Path > Projects から追加さえすれば、すぐにでも Mahout のソースを参照しながらコードを書けるだろう。


次……はわかんないけど、書くとしたら多分 EclipseHadoop な Mahout をごにょごにょする環境構築、かな。


あ、そうそう。
Eclipse を英語のまま使っているのは、その方がわかんないことがあったときにググって情報見つけやすいから。決してめんどくさいからだけじゃあないからね!