0

次のRiakマップフェーズを実行しました。

-module(delete_map_function).

-export([get_keys/3]).

%Returns bucket and key pairs from a map phase
get_keys(Value,_Keydata,_Arg) ->
  [[riak_object:bucket(Value),riak_object:key(Value)]].

そして、次のRiak削減フェーズ:http ://contrib.basho.com/delete_keys.html

このエラーメッセージが表示され続けます:

{"phase":0,"error":"function_clause","input":"{{error,notfound},{<<\"my_bucket\">>,<<\"item_key\">>},undefined}","type":"error","stack":"[{riak_object,bucket,[{error,notfound}],[{file,\"src/riak_object.erl\"},{line,251}]},{delete_map_function,get_keys,3,[{file,\"delete_map_function.erl\"},{line,7}]},{riak_kv_mrc_map,map,3,[{file,\"src/riak_kv_mrc_map.erl\"},{line,164}]},{riak_kv_mrc_map,process,3,[{file,\"src/riak_kv_mrc_map.erl\"},{line,140}]},{riak_pipe_vnode_worker,process_input,3,[{file,\"src/riak_pipe_vnode_worker.erl\"},{line,444}]},{riak_pipe_vnode_worker,wait_for_input,2,[{file,\"src/riak_pipe_vnode_worker.erl\"},{line,376}]},{gen_fsm,...},...]"}

私はJava経由でジョブを実行しています:

MapReduceResult mapReduceResult = RiakUtils.getPBClient().mapReduce(iq)
                 .addMapPhase(new NamedErlangFunction("delete_map_function", "get_keys"))
                 .addReducePhase(new NamedErlangFunction("delete_reduce_function", "delete"))
                 .execute();

マップフェーズで引数を使用する必要があることをどこかで読みましたfilter_notfoundが、追加した後もエラーが発生し続けます。

MapReduceResult mapReduceResult = RiakUtils.getPBClient().mapReduce(iq)
                 .addMapPhase(new NamedErlangFunction("delete_map_function", "get_keys"), "filter_notfound")
                 .addReducePhase(new NamedErlangFunction("delete_reduce_function", "delete"))
                 .execute();

Riak 1.3を実行していて、 RiakJavaクライアントv1.1.0を使用しています

4

1 に答える 1

1

初め。map/reduce フェーズでキーを削除するのは効率的ではないと思います。キーリストを取得してマップフェーズにフィードすると、riak は最初にすべてのオブジェクトを読み取り、次にそれを関数に渡します。したがって、オブジェクトを削除するだけでよい場合は、読み取りなしで実行することをお勧めします。

2番。すべての map/reduce 関数は、次の例外を除いて記述する必要があります。

  • の代わりに、リアクの最終的な性質のためにValue得ることができます。{error, notfound}
  • また、削除された riak オブジェクトを として取得することもできますValue。特別なフラグによってオブジェクトが削除されたことを知ることができますdict:is_key(<<"X-Riak-Deleted">>, riak_object:get_metadata(RiakObj)):

三番。エラーを修正するには、リストから notfound キーをフィルタリングする必要があります。

get_keys({error, notfound},_Keydata,_Arg) ->
    [];
get_keys(Value,_Keydata,_Arg) ->
    [[riak_object:bucket(Value),riak_object:key(Value)]].
于 2013-03-24T07:10:45.387 に答える