FlockDB (1)
前置き
この記事はScala Advent Calendar jp 2011最終日用のエントリーです。
FlockDBって何?
FlockDBはグラフDBです。グラフDB?(゚д゚)ハァ?って人はこちらのスライドを読んで下さい。
そのスライドでも紹介されているNeo4jとかとはどう違うの?って思うかもしれませんが、FlockDBのREADMEにその辺が書いてあります。要は「機能少なめ、性能高め」って事らしいです。
FlockDBの仕組み
非常に情報が少ないんですが、以下のページをざっと読んだ所、内部で gizzard を使っていて、そのバックエンドとしてMySQL を使っている?とりあえずこの記事を書きながら、中身についても調べていこうと思います。
なんでFlockDBに興味を持ったか
今、仕事でRettyというソーシャル系のウェブサービスを作っているのですが、そこでグラフDBの導入を検討しています。
具体的には、主に以下の3種類の「ノード」があります。
- ユーザー
- お店(飲食店)
- レビュー
各ノード間の関係としては以下のようなものがあります。
→ は片方向の関係、⇔ は双方向の関係です。
- ユーザー → ユーザー (サイト内でのフォロー、Twitterでのフォロー)
- ユーザー ⇔ ユーザー (Facebookのフレンド)
- ユーザー → お店 (レビュー、レビュー内の4段階評価)
- ユーザー → レビュー (いいね、行きたい)
グラフDBを以下のような所で使えないかと考えています。
- 嗜好の近いユーザー(例えば、同じレビューに「いいね」「行きたい」を多く付けている)の検索
- 類似のお店(例えば、同じユーザーに高評価をされている)の検索
- フォローしているユーザーがフォローしているユーザー(2 hop先)の投稿の検索
- etc.
レコメンデーションとかは、実際にはグラフDB単体だけでは無理で、レビュー等を全文検索エンジンでインデックス化した上で、タームベクトルを各エッジのプロパティとして持たせたりとか(?)、他の技術との組み合わせになりそうですが、その辺は別でエントリ書きます。
FlockDBのビルド
このページを参考にしました。
yumレポジトリを追加とか
[kashima@www3220u ~]$ wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm [kashima@www3220u ~]$ sudo rpm -ivh epel-release-5-4.noarch.rpm [kashima@www3220u ~]$ sudo wget http://dev.centos.org/centos/5/CentOS-Testing.repo -O /etc/yum.repos.d/CentOS-Testing.repo
Ant
FlockDBがApache Thriftを必要としているのですが、Thriftのビルドの為にAntが必要です。yumで入れられるAntのバージョンだとNGなので、新しいものを落としてきます。Antって懐かしいですね。
でも、その前にjavaを入れます。
[kashima@www3220u ~]$ sudo yum install java-1.6.0-openjdk
で、Antを。
[kashima@www3220u downloads]$ sudo tar jxf apache-ant-1.8.2-bin.tar.bz2 -C /usr/local
/etc/profile.d/ant.sh というファイルを以下の内容で作成します。
#!/bin/sh export ANT_HOME=/usr/local/apache-ant-1.8.2 export PATH=$ANT_HOME/bin:$PATH
バージョン確認。
[kashima@www3220u ~]$ ant -version Unable to locate tools.jar. Expected to find it in /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/lib/tools.jar Apache Ant(TM) version 1.8.2 compiled on December 20 2010
Thriftビルドに必要なパッケージ
develパッケージをもろもろインストールします。
[kashima@www3220u ~]$ sudo yum --enablerepo="c5-testing" install php-devel java-devel ant python-devel erlang boost-devel
Thriftのビルド
まずはダウソして、specファイルだけを取り出します。
[kashima@www3220u downloads]$ tar zxf thrift-0.5.0.tar.gz thrift-0.5.0/contrib/thrift.spec
詳細は省略しますが、このspecファイルだと色々問題があるので、パッチを落としてきて当てます。
[kashima@www3220u downloads]$ wget http://www.blamethecomputer.com/files/thrift/thrift-0.5.0-spec.patch [kashima@www3220u downloads]$ patch -p0 < thrift-0.5.0-spec.patch patching file thrift-0.5.0/contrib/thrift.spec Hunk #1 succeeded at 27 with fuzz 2.
後はビルドです。最初からantが入っている場合は、PATHでそちらが先にこないように気をつけましょう。
[kashima@www3220u downloads]$ sudo -E rpmbuild -ba thrift-0.5.0/contrib/thrift.spec [kashima@www3220u downloads]$ sudo rpm -ivh /usr/src/redhat/RPMS/x86_64/thrift-0.5.0-1.x86_64.rpm
FlockDBのビルドの前に・・・
ようやくFlockDBのビルドに入れ・・・ません。
git と sbt を設定。
[kashima@www3220u downloads]$ sudo yum install git [kashima@www3220u downloads]$ mkdir ~/bin [kashima@www3220u downloads]$ pushd ~/bin [kashima@www3220u bin]$ wget http://simple-build-tool.googlecode.com/files/sbt-launch-0.7.7.jar [kashima@www3220u bin]$ ln -s sbt-launch-0.7.7.jar sbt-launch.jar
~/bin/sbt を以下の内容で作成。
#!/bin/bash java -Xmx512M -jar `dirname $0`/sbt-launch.jar "$@"
後は実行権限を与えます。
[kashima@www3220u bin]$ chmod +x ~/bin/sbt
FlockDBのビルド
ようやくFlockDBのビルドに入れます。まずは FlockDB を落としてきます。
[kashima@www3220u downloads]$ git clone https://github.com/twitter/flockdb.git Cloning into flockdb... error: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed while accessing https://github.com/twitter/flockdb.git/info/refs fatal: HTTP request failed
何かSSLの証明書関係でエラーが出ましたが、面倒なので無視することにしました。(この辺を参考に)
[kashima@www3220u downloads]$ GIT_SSL_NO_VERIFY=true git clone https://github.com/twitter/flockdb.git
後はビルドです。NO_TESTS=1 をつけないと、テストが走るので要注意(テストにはMySQLが必要なので、エラーが
出まくる)。
[kashima@www3220u flockdb]$ NO_TESTS=1 sbt package-dist
これでようやくビルドが終了しました。
FlockDBのデモプログラムを動かす
ビルドに時間がかかったのでここで満足してしまいそうですが、まずはRubyで出来ているデモを動かしてみます。目的はFlockDBの動作を確認する事です。
MySQLのインストール、起動
この辺はさくっと。
[kashima@www3220u ~]$ sudo yum install mysql-server [kashima@www3220u ~]$ sudo /etc/init.d/mysqld start [kashima@www3220u ~]$ /usr/bin/mysqladmin -u root password 'xxxxxxx'
gizzmoとかRubyとか・・・
デモを動かすためにはgizzmoが必要そうです。gizzmoはGizzardクラスターを管理するためのコマンドラインツールだそうです。Gizzardについてはggrksです。以前Scala勉強会 in 渋谷でちょっとだけ話題に出ました。
ちなみにgizzmoもRubyで出来たプログラムです。だんだんScala Advent Calendarの趣旨から外れてきましたが、まずはFlockDBがどのような動作をするのかが分からないと話が進みませんので、涙を飲みつつRubyの環境を整えてgizzmoを入れましょう。
[kashima@www3220u ~]$ sudo yum install ruby [kashima@www3220u ~]$ sudo yum install rubygems [kashima@www3220u ~]$ sudo gem install gizzmo
試しにgizzmoを動かしてみます。
[kashima@www3220u bin]$ gizzmo help /usr/bin/gizzmo:19:in `load': no such file to load -- gizzmo (LoadError) from /usr/bin/gizzmo:19
動きません・・・
ちょっと調べたんですが、Ruby力が低いので原因究明に至らず。
→ (追記)半日くらい悩んだ結果、原因が分かったので次回続きを書きます。以下のページが参考になりました。
まとめ
長くなったので、一旦ここで終了します。続きはこちら。
読んでの通り、環境構築が非常に面倒でドキュメントも少ないので、実用性を考えると手を出すのは危険そうです。Twitter以外で実際本番環境で使っている所はどれ位あるのかが気になります。
最初に書いた通り、FlockDBの長所・短所がREADMEに書いてありますが、Twitterのような「on-line, low-latency, high throughput」を必要とする場面はそれほど多く無さそうです。
と言うことで、私自身は今の仕事でのFlockDBの採用は見送ることにしましたが、せっかくなので勉強がてらもう少し触ってみたりすることにします。