k4200’s notes and thoughts

Programmer side of k4200

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単体だけでは無理で、レビュー等を全文検索エンジンでインデックス化した上で、タームベクトルを各エッジのプロパティとして持たせたりとか(?)、他の技術との組み合わせになりそうですが、その辺は別でエントリ書きます。

環境

本エントリは以下の環境で検証しています。

CentOSを使った理由ですが、FlockDBを仕事で使う事を検討しているので、仕事の環境(EC2, Amazon Linux)に近い環境にしようと思って選びました。

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力が低いので原因究明に至らず。
→ (追記)半日くらい悩んだ結果、原因が分かったので次回続きを書きます。以下のページが参考になりました。

RubyGemsはrequireの裏で何をやっているのか?

まとめ

長くなったので、一旦ここで終了します。続きはこちら

読んでの通り、環境構築が非常に面倒でドキュメントも少ないので、実用性を考えると手を出すのは危険そうです。Twitter以外で実際本番環境で使っている所はどれ位あるのかが気になります。

最初に書いた通り、FlockDBの長所・短所がREADMEに書いてありますが、Twitterのような「on-line, low-latency, high throughput」を必要とする場面はそれほど多く無さそうです。

と言うことで、私自身は今の仕事でのFlockDBの採用は見送ることにしましたが、せっかくなので勉強がてらもう少し触ってみたりすることにします。