PFI+NTTの大規模データリアルタイム分析基盤JubatusをMacで動かす

NTTとPFIから、大規模データ分析基盤のJubatusオープンソースとして公開されました。
http://preferred.jp/2011/10/jubatus.html

ホームページのチュートリアルには、動作環境としてLinux2.6以降とありますが、Macでも動きましたので、MacPortsとしてまとめてみました。ただし、まだ動作検証をあまりしていないので、おかしなところがあるかもしれません。

なお、Debian Linuxでのインストール手順の記事も参考になりました。
Jubatusのインストールと若干の動作確認 - kuenishi's blog

インストールにあたって必要なソフトがいくつもありますが、そのうちの pkgconfig, py-msgpack, msgpack, libzookeeper, ux-trie, mecab-utf8のportはすでにあり、今回新たに、pficommon, re2, google-glog と jubatus および py-jubatus-client を追加しました。

これらのソフトを導入するにあたり、Linuxからポーティングすることになる訳ですが、LinuxMacでは共有ライブラリに違いが結構あります。
まず、共有ライブラリの拡張子が、.soではなく.dylibとなります。

システムの基本的なライブラリが、/usr/lib/libSystem.B.dylib にまとめられています。libcやlibmなどのライブラリがシンボリックリンクになっていて、コンパイル時に指定しなくても構わないのですが、libcryptはリンクが存在しないため、指定するとエラーになります。

Macの共有ライブラリは2段階の名前空間を採用していて、リンクしている共有ライブラリが参照している別の共有ライブラリの関数をプログラムから参照することができないようです。Linuxと同様のことをしたい場合、ビルド時に-flat_namespace を指定することになります。
Porting UNIX/Linux Applications to Mac OS X: Compiling Your Code in Mac OS X

ライブラリを実行時に参照するときに必要なパス名がライブラリ自体に書き込まれていて、ビルド時に”-install_name <インストール先>"を指定するか、install_name_toolを利用して書き換えることができます。ところで、今回必要となるソフトのいくつかは、PythonベースのビルドツールであるWAFを利用していますが、WAFの最新版1.6では、どうやらこの-install_name指定に対応していないようです。

さて、MacPortsでのインストールとサーバの起動ですが、次のようになります:

$ sudo port selfupdate
$ sudo port install jubatus py-jubatus-client
$ jubaclassifier --name test

これで、チュートリアルにしたがって動作確認ができると思います。