Riak Erlang map / reduce返回{error,notfound}

时间:2013-03-24 01:45:24

标签: erlang mapreduce riak

我正在运行以下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();

我已经读过某个地方,我应该在Map阶段使用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并使用Riak Java client v1.1.0

1 个答案:

答案 0 :(得分:1)

首先。我认为通过map / reduce阶段删除密钥并不是一种有效的方法。如果您获得了键列表并将其提供给映射阶段,则riak将首先读取所有对象,然后将其提供给您的函数。因此,如果您只需要删除对象,最好不要读取它。

二。应编写所有map / reduce函数,但以下情况除外:

  • 而不是Value,您可以获得{error, notfound}因为riak的最终性质。
  • 您也可以将删除的riak对象作为Value删除。您可以知道该对象已被特殊标记dict:is_key(<<"X-Riak-Deleted">>, riak_object:get_metadata(RiakObj))删除:

第三。要修复错误,您应该从列表中过滤未发现的密钥:

get_keys({error, notfound},_Keydata,_Arg) ->
    [];
get_keys(Value,_Keydata,_Arg) ->
    [[riak_object:bucket(Value),riak_object:key(Value)]].