Engineer in Tokyo

Riak を Python で使う

Riak Logo

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')

bucketclient オブジェクトを内蔵しているので、接続オブジェクトとして 使いまわすことが出来ます。

データを保存

それで、一個一個のレコードはJSONオブジェクトみたいなフォーマットで保存するのですが、そのJSONデータをラッピングするRiakObjectがあります。キーを決めて、RiakObjectを作成して、最終的にstore()メソッドを呼び出すことで、保存します。

>>> obj = bucket.new('key', data={
...     'spam': 'hoge',
...     'eggs': 'fuga',
... })
>>> obj.store()

データを取得

データを取得するのが簡単で、キーで取得するだけ。bucketget()メソッドでキーを渡して、データ保存する時の同じ RiakObjectが返ってきます。

JSONのdictデータを取得する為に、RiakObjectget_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からつなげて、割と、面白いなと思いますので、是非使ってみて下さい。