Riak を Python で使う

RiakはBashoが作っているキーべリューストレージ (KVS) システム。せっかくRiak Meetup Tokyoに参加しているっていうことをきっかけにして、RiakをPythonから使ってみよう。
インストールなど
Riakをインストールするにはちょっと面倒くさいことがあるけど、動かしてみると使いやすい。Riakのインストールはここに説明しないけど、僕が以前にRiak Source Code Readingで発表したRiakのインストールと動作の内容を見て頂ければと思います => Let’s りあっくぅ
クライアントの準備
RiakをPythonから使う為のクライアントライブラリが用意されています。実際はオープンソースで、GitHubでソースコード見れます。PyPIにも上がっていて、pipで簡単にインストールできます:
pip install riak
その後は、簡単に riak モジュールをインポートできます。
接続
まずは、サーバーに接続しよう。上の資料でRiakの開発環境を立ち上げる時に デフォルトポートと違うポートになるので、その設定に合わせます。
>>> client = riak.RiakClient(
... host="127.0.0.1",
... port=8091,
... )
RiakはデータをBucketという名前空間でデータを分ける形になっている。アプリケーションでデータをBucket毎に分けたりすることができますが、大抵は同じBucketをよく使うと思います。それでbucketオブジェクトを作ります。
>>> bucket = client.bucket('mybucket')
bucket が client オブジェクトを内蔵しているので、接続オブジェクトとして 使いまわすことが出来ます。
データを保存
それで、一個一個のレコードはJSONオブジェクトみたいなフォーマットで保存するのですが、そのJSONデータをラッピングするRiakObjectがあります。キーを決めて、RiakObjectを作成して、最終的にstore()メソッドを呼び出すことで、保存します。
>>> obj = bucket.new('key', data={
... 'spam': 'hoge',
... 'eggs': 'fuga',
... })
>>> obj.store()
データを取得
データを取得するのが簡単で、キーで取得するだけ。bucketのget()メソッドでキーを渡して、データ保存する時の同じ
RiakObjectが返ってきます。
JSONのdictデータを取得する為に、RiakObjectのget_data()メソッドを呼び出す。
>>> obj = user_bucket.get('key')
>>> obj.get_data()
{'spam': 'hoge', 'eggs': 'fuga'}
MapReduce
MapReduceはJavaScriptで書くことができます。RiakはFirefoxが使っているJavaScriptエンジンSpiderMonkeyを使っています。
まずは、client オブジェクトにadd()メソッドを呼び出して、MapReduce のクエリーに「追加」する形になる。クエリーを作ったら、map() メソッドにMap関数のJavaScriptを渡して、run()メソッドで実行出来ます。
>>> query = client.add('mybucket')
>>> query.map("function(v) { var data = JSON.parse(v.values[0].data); if(data.spam) { return [[v.key, data]]; } return []; }")
>>> for spam in query.run():
.... print("%s - %s" % (spam[0], spam[1]))
key - {'spam': 'hoge', 'eggs': 'fuga'}
まとめ
RiakのPythonクライアントは実際Riak作っているBashoの中の人はメンテしているので、Secondary Index、Searchを含めて、基本的にすべての機能が使えて、安定しています。Pythonクライアントの公式ドキュメントは以下のURLでアクセスできるから、興味がある方、是非見て下さい(英語ですが。。)
http://basho.github.io/riak-python-client
分散サーバーにしては、Riakは結構簡単に動かせて、簡単にPythonからつなげて、割と、面白いなと思いますので、是非使ってみて下さい。