6

システムから古いデータを消去するために、Riak バケットを削除したいと考えています。これを行うための単一の Riak API はないことは理解していますが、代わりに、バケット内のすべてのキーを削除することで効果的に削除できます。Riak はすべてのキーをフェッチするための API を提供しているので、これはかなり簡単です。

これを行うためのコードをオンラインで見つけましたが、JavaScript で記述されており、Node.js で実行されます。私はPythonで何かが欲しいです。これはおそらく簡単なことです。誰にも例がありますか?

4

2 に答える 2

11

質問で言ったように、これは特にリクエストライブラリでは非常に簡単だと思ったので、これを行うためのスクリプトを開発しました。Riak keys=true(つまり、チャンクされていない)モードから始めましたが、大きなバケットでは失敗しました。チャンクモード()に切り替えましkeys=streamたが、出力は単一のJSONオブジェクトではなく、一連の連結オブジェクトでし{...}{...}...{...}た(つまり、同僚が、解析した集約されたRiak応答からJSONオブジェクトを分割するための正規表現を提供してくれました順番に処理されます。悪くはありません。コードは次のとおりです。

#!/usr/bin/python
# script to delete all keys in a Riak bucket

import json
import re
import requests
import sys

def processChunk(chunk):
    global key_count
    obj = json.loads(chunk.group(2))
    if 'keys' in obj:
        for key in obj['keys']:
            r = requests.delete(sys.argv[1] + '/' + key)
            print 'delete key', key, 'response', r.status_code
            key_count += 1


if len(sys.argv) != 2:
    print 'Usage: {0} <http://riak_host:8098/riak/bucket_name>'.format(sys.argv[0])
    print 'Set riak_host and bucket_name appropriately for your Riak cluster.'
    exit(0)

r = requests.get(sys.argv[1] + '?keys=stream')
content = ''
key_count = 0

for chunk in r.iter_content():
    if chunk:
        content += chunk

re.sub(r'(?=(^|})({.*?})(?={|$))', processChunk, content)

print 'Deleted', key_count, 'keys'

私の問題はこの時点でほぼ解決されていますが、もっと良い解決策があるのではないかと思います。このページに追加してください。数週間後に代替案が提供されない限り、私は自分の答えを受け入れません。

于 2013-01-25T23:15:13.897 に答える
2

python riak-client を使用するオプションがある場合、これはより少ないコードで実現できます。

#!/usr/bin/python
import riak

riak_handle = riak.RiakClient(pb_port=8087, protocol='pbc')
riak_bucket = riak_handle.bucket('default')

for keys in riak_bucket.stream_keys():
    for key in keys:
        print('Deleting %s' % key)
        riak_bucket.delete(key)

それがあなたの主なユースケースである場合、引数を使用するようにそれを適応させることができます。

于 2014-08-13T11:52:41.137 に答える