FlockDB (2)
はじめに
この記事はScala Advent Calendar jp 2011最終日用のエントリーです。
前回はApache Thrift, FlockDBのビルド、そしてFlockDBのデモの動作を試して失敗しました。
今回の目標は
続・FlockDBのデモを動かす
gizzmo が動かない
前回gizzmoが動かなかった原因ですが、権限の問題でした。gem installでインストールされたファイルが、一般ユーザーだと読めないようになっていたので、解決方法としては
- 権限を変更
- root で実行
面倒なので後者にしました。
で、以下のコマンドを実行すると・・・ようやくちゃんと表示されました!!
[kashima@www3220u ~]$ sudo gizzmo help (略)
シャードの設定?
環境変数にMySQLのユーザー名とパスワードを設定します(リモートのMySQLを使う方法は今の所不明)。
$ export DB_USERNAME="root" $ export DB_PASSWORD="password"
~/.gizzmorc という設定ファイルを作ります。
host: localhost port: 7920
手順に従って環境設定スクリプトを動かしてみます。何やらメッセージが大量に出ます。上手くいったのかどうかも良く分かりません。
[kashima@www3220u flockdb]$ sudo -E ./dist/flockdb/scripts/setup-env.sh Killing any running flockdb... Launching flockdb... Creating shards... 1 Connection refused - connect(2) /usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/vendor/thrift_client/simple.rb:324:in `initialize' /usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/vendor/thrift_client/simple.rb:324:in `new' /usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/vendor/thrift_client/simple.rb:324:in `_proxy' /usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/thrift.rb:142:in `_proxy' (eval):1:in `create_shard' /usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/nameserver.rb:114:in `send' /usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/nameserver.rb:114:in `method_missing' /usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/nameserver.rb:148:in `with_retry' /usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/nameserver.rb:114:in `method_missing' /usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/commands.rb:259:in `run' /usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/commands.rb:257:in `each' /usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/commands.rb:257:in `run' /usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/commands.rb:18:in `run' /usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzmo.rb:499 /usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzmo.rb:493:in `custom_timeout' /usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzmo.rb:498 /usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/bin/gizzmo:3:in `load' /usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/bin/gizzmo:3 /usr/bin/gizzmo:19:in `load' /usr/bin/gizzmo:19 (略) Usage: gizzmo addforwarding TABLE_ID BASE_ID SHARD_ID Add a forwarding from a graph_id / base_source_id to a given shard. Usage: gizzmo addforwarding TABLE_ID BASE_ID SHARD_ID Add a forwarding from a graph_id / base_source_id to a given shard. 13 14 15 Done.
一応戻り値を確認してみます。
[kashima@www3220u flockdb]$ echo $? 0
OK?
動作確認
とりあえず動作確認してみます。
[kashima@www3220u flockdb]$ ps aux | grep java root 29535 9.9 44.3 787752 226648 pts/0 Sl 17:36 0:25 java -Xms256m -Xmx256m -XX:NewSize=64m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -server -jar ./dist/flockdb/flockdb-1.8.0-alpha16-SNAPSHOT.jar config/development.scala kashima 29964 0.0 0.1 6040 576 pts/0 S+ 17:40 0:00 grep java
プロセスは動いってるっぽいです。
[kashima@www3220u flockdb]$ sudo netstat -nlp | grep 29535 tcp 0 0 :::9990 :::* LISTEN 29535/java tcp 0 0 :::7915 :::* LISTEN 29535/java tcp 0 0 :::7920 :::* LISTEN 29535/java tcp 0 0 :::7921 :::* LISTEN 29535/java
いくつかのポートで待ち受けてるっぽいです。
挨拶してみます。
[kashima@www3220u flockdb]$ curl localhost:9990/server_info.txt build: 20111223-173553 build_branch_name: unknown build_last_few_commits: unknown build_revision: d9f09a90d7ed8931e117615e5ca96155a46837ac name: flockdb start_time: Fri Dec 23 17:36:16 JST 2011 uptime: 184169 version: 1.8.0-alpha16-SNAPSHOT
なんか動いているようです。
FlockDBとお話しする
引き続きデモの説明に従って。
RubyのFlockDBクライアントのインストール
説明に従ってFlockDBのクライアントを入れます。
[kashima@www3220u ~]$ sudo gem install flockdb Building native extensions. This could take a while... ERROR: Error installing flockdb: thrift_client requires thrift (~> 0.7.0, runtime)
thrift とか thrift_client が必要らしいのでインストールします。
[kashima@www3220u ~]$ sudo gem install thrift_client Building native extensions. This could take a while... Successfully installed thrift-0.7.0 Successfully installed thrift_client-0.7.1 2 gems installed
再度試した所OKでした。
[kashima@www3220u ~]$ sudo gem install flockdb Successfully installed flockdb-0.7.1 1 gem installed Installing ri documentation for flockdb-0.7.1... Installing RDoc documentation for flockdb-0.7.1...
もうちょいRuby関係で・・・
非常に長かったですが、ようやくFlockDBの機能を使う所まで辿り着い・・・てないようです。
[kashima@www3220u ~]$ sudo -E irb irb(main):001:0> require "rubygems" => true irb(main):002:0> require "flockdb" Gem::Exception: can't activate thrift (~> 0.7.0, runtime), already activated thrift-0.8.0 from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:149:in `activate' from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:165:in `activate' from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:164:in `each' from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:164:in `activate' from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:165:in `activate' from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:164:in `each' from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:164:in `activate' from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:35:in `require' from (irb):2
何かバージョン関連のエラーっぽいです。
調べてみると thrift 0.8.0 と 0.7.1 の両方が入っています。0.8.0 なんて入れた覚えはないのですが、削除します。
[kashima@www3220u ~]$ gem list *** LOCAL GEMS *** flockdb (0.7.1) gizzmo (0.11.2) thrift (0.8.0, 0.7.0) thrift_client (0.7.1) [kashima@www3220u ~]$ sudo gem uninstall thrift -v 0.8.0 Successfully uninstalled thrift-0.8.0
これでようやくOKっぽいです。
[kashima@www3220u ~]$ sudo -E irb irb(main):001:0> require "rubygems" => true irb(main):002:0> require "flockdb" => true
データの作成
デモの通り進めてみます。
まずは2種類の関係(フォロー、ブロック)を持つグラフを定義しているようです。
irb(main):003:0> flock = Flock.new "localhost:7915", :graphs => { :follows => 1, :blocks => 2 } => #<Flock::Client:0x2b003f4f9e48 @service=<Flock::Service(Flock::Edges::FlockDB::Client) @current_server=localhost:7915>, @graphs={:follows=>1, :blocks=>2}>
現在空のグラフなのですが、何人のユーザーがユーザー"1"をフォローしているか検索してみます(結果は空のはず)。
irb(main):004:0> flock.select(nil, :follows, 1).to_a Flock::Edges::FlockException: Flock::Edges::FlockException from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/gen-rb/flock_d_b.rb:171:in `recv_select' from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/gen-rb/flock_d_b.rb:161:in `select' from /usr/lib/ruby/gems/1.8/gems/thrift_client-0.7.1/lib/thrift_client/abstract_thrift_client.rb:150:in `send' from /usr/lib/ruby/gems/1.8/gems/thrift_client-0.7.1/lib/thrift_client/abstract_thrift_client.rb:150:in `handled_proxy' from /usr/lib/ruby/gems/1.8/gems/thrift_client-0.7.1/lib/thrift_client/abstract_thrift_client.rb:60:in `select' from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operations/select_operation.rb:31:in `get_results' from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operations/select_operation.rb:40:in `operation' from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operation.rb:48:in `call' from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operation.rb:48:in `get_results' from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operation.rb:22:in `current_page' from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operation.rb:77:in `next?' from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operation.rb:62:in `each' from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operations/select_operation.rb:4:in `each' from (irb):4:in `to_a' from (irb):4
to_a でエラーになってるので、to_a を外してみると何か返ってきました。
irb(main):005:0> flock.select(nil, :follows, 1) => #<Flock::SimpleOperation:0x2b003f483568 @term=#<Flock::QueryTerm:0x2b003f483590 @states=[], @destination=1, @graphs={:follows=>1, :blocks=>2}, @graph=1, @source=nil>, @service=<Flock::Service(Flock::Edges::FlockDB::Client) @current_server=>, @client=#<Flock::Client:0x2b003f4f9e48 @service=<Flock::Service(Flock::Edges::FlockDB::Client) @current_server=>, @graphs={:follows=>1, :blocks=>2}>>
あまりRubyに時間を使いたくないので、サクサク進めます。
以下のように実行するらしいです。
>> flock.add(20, :follows, 1) => nil >> flock.add(21, :follows, 1) => nil >> flock.add(22, :follows, 1) => nil
ここでは、ユーザー 1, 20, 21, 22というノードを作成し、20, 21, 22が1をフォローするという関係を作成しているようです。ノードを明示的に作成しなくても、エッジを作成すれば自動的にノードが作成されるたいです。
実際にやってみると・・・
irb(main):014:0> flock.add(20, :follows, 1) TypeError: wrong argument type Symbol (expected Proc) from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operations/execute_operations.rb:23:in `to_thrift' from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operations/execute_operations.rb:18:in `apply' from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/client.rb:87:in `update' from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/client.rb:92:in `add' from (irb):14
FlockDBのMLでも同じ話題が出ていますが、反応無しです。
渡している型が違うと言っているのは分かるのですが、正しい型が分かりません。