ひとりでやるRiak Advent Calendar 2012 day6 - MapReduceで遊んでみよう

ふつうのKVSだと、シンプルなput/get/deleteの3種類のオペレーションがあって、あとはせいぜいリッチなやつだとスキャンができたり、分散してないやつだとインデックスが張れたりトランザクションぽいものができたりするようになっている。しかしSQLのようなクエリを書けるものはドキュメント指向DBと呼ばれる一部のものだけだ。

Saltpans near Fuelcaliente

まずは準備として、どこでもよいのでRiakをひとつ立ち上げる。コンソールから手書きでMapReduceを書いてもよいのだがエスケープやJSONの括弧を閉めるのが大変なのでオモチャのようなGUIを作ったので、まずはこれをbrowser.htmlという名前でダウンロードしていただきたい。ええいHTML/CSSがダサいのは分かっておるわ! ではそのファイルをRiakに入れよう。

$ curl -X PUT http://localhost:8098/buckets/static/keys/browser.html -H "content-type: text/html" -T browser.html
$ open http://localhost:8098/buckets/static/keys/browser.html

無事にブラウザに"Riak toybox"という文字が表示されたらここまでは完了。下の方にlistkeysというリンクがあるので、それをクリックするとすぐ下に登録されている全部のキーが表示される。Riakを立ち上げてdataというbucketを少しもいじってないのであれば空のはずだ。適当にデータを入れてみよう。ここではコンソールからの例

$ curl -X PUT http://localhost:8098/buckets/data/keys/spam \
     -H "content-type: application/json" -d '{"count" : 32}
$ curl -X PUT http://localhost:8098/buckets/data/keys/ham \
     -H "content-type: application/json" -d '{"count" : 64}
$ curl -X PUT http://localhost:8098/buckets/data/keys/egg \
     -H "content-type: application/json" -d '{"count" : 42}

content-typeの指定はあってもなくてもよかったように思う。-dでputのbodyを指定するので、countというプロパティをとりあえずつけておく。これでもう一度listkeysをクリックすると

{keys, ["spam", "ham", "egg"]}

と表示されたことと思う。それで成功だ。上にある "query" というリンクをクリックすると

[138]

と表示されるかと思う。これはつまり、上のformに書かれているmapとreduceが実行された結果だ。実際に合計になっている。試しに

function(v){
  return [1];
}

とすると、結果は

[3]

になったかと思う。つまりvはひとつひとつのkey-valueのペアだ。Siblingsがあったときどうなるのかは…読者への宿題です(キリっ)。
右側のreduceも同様にいろいろと書き換えて遊んでもらいたい。chromeを使っているならhttp requestをdevtoolsで見てもらって、どのようなリクエストが飛んでいるかを理解するとよいだろう。ちなみに、他にもマニアックな機能がたくさんあるらしいので公式ドキュメントを参照いただきたい。