ひとりでやるRiak Advent Calendar 2012 day21 - misc tips

Tips

キーをランダムに生成

POSTを使います。

$ curl -i -X POST http://localhost:8098/buckets/spam/keys -d "dada"
HTTP/1.1 201 Created
Vary: Accept-Encoding
Server: MochiWeb/1.1 WebMachine/1.9.2 (someone had painted it blue)
Location: /buckets/spam/keys/GO6judbI9AXnO7j8AYDLnP0Xl5S
Date: Sun, 17 Mar 2013 03:03:26 GMT
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

$ curl http://localhost:8098/buckets/spam/keys/GO6judbI9AXnO7j8AYDLnP0Xl5S
dada%

pbインターフェースだとどうなるんだろう。

2i(secondary index)をはる

 $ curl -i -X POST http://localhost:8098/buckets/spam/keys -d '{"name":"john smith"}' -H "x-riak-index-name_bin: john" 
HTTP/1.1 201 Created
Vary: Accept-Encoding
Server: MochiWeb/1.1 WebMachine/1.9.2 (someone had painted it blue)
Location: /buckets/spam/keys/FZBnJO4frJUrnhVTg7w8ldvwnpQ
Date: Sun, 17 Mar 2013 03:08:22 GMT
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

$ curl -i http://localhost:8098/buckets/spam/keys/FZBnJO4frJUrnhVTg7w8ldvwnpQ
HTTP/1.1 200 OK
X-Riak-Vclock: a85hYGBgzGDKBVIcypz/fga6qgpnMCUy5rEyLFu/8xRfFgA=
x-riak-index-name_bin: john
Vary: Accept-Encoding
Server: MochiWeb/1.1 WebMachine/1.9.2 (someone had painted it blue)
Link: </buckets/spam>; rel="up"
Last-Modified: Sun, 17 Mar 2013 03:08:22 GMT
ETag: "5uqM42uhR9BjEZqgwaEKfm"
Date: Sun, 17 Mar 2013 03:08:48 GMT
Content-Type: application/x-www-form-urlencoded
Content-Length: 21

{"name":"john smith"}%
$ curl -i http://localhost:8098/buckets/spam/index/name_bin/john
HTTP/1.1 200 OK
Vary: Accept-Encoding
Server: MochiWeb/1.1 WebMachine/1.9.2 (someone had painted it blue)
Date: Sun, 17 Mar 2013 03:09:24 GMT
Content-Type: application/json
Content-Length: 40

{"keys":["FZBnJO4frJUrnhVTg7w8ldvwnpQ"]}% 

これでnameというインデックスにjohnが着いている人が全員とってこれるようになる。

2i+MapReduce

これをMapReduceのinputにすることもできる。

$ curl -X POST -H "content-type: application/json" -d @- http://localhost:8098/mapred \
<<EOF
{
   "inputs":{
       "bucket":"spam",    
       "index":"name_bin",  
       "key":"john"
   },
   "query":[
      {
         "reduce":{
            "language":"erlang",
            "module":"riak_kv_mapreduce",
            "function":"reduce_identity",
            "keep":true
         }
      }
   ]
}
EOF
[["spam","FZBnJO4frJUrnhVTg7w8ldvwnpQ"],["spam","90rrJwJvKEKDMGy9YQFrrcyhZhu"]]%

帰ってくるのは、bucket名とKeyのペアのようだ。こいつを使えば、mapredを2回呼べばJOINのようなクエリも発行できるだろうとは思う。

しかし2iに注意してほしいのは、そんなに効率のよい実装になっているわけではない(そもそも分散データベースでインデックスというのはトランザクショナルになりかねないのであって…)ので秒間数千とかそういうオーダーでの性能は期待できない。HBaseやCassandraと同じでキーの設計は慎重に。
それぞれの言語のライブラリをどう叩くかは、各言語のリファレンスにある程度サンプルがあるはずなので参考にしてもらいたい。基本的には上記のようなインターフェースがベースにあるので、APIはある程度似通ってくるだろう。