我有一个 riak 桶,其中包含大约 1600 万条记录。我试图通过对存储桶中的所有键进行简单计数来尝试使用 mapreduce:
curl -v -d '{"inputs":"mybucket",
"timeout": 86400000,
"query":[
{"map":{
"language":"erlang",
"module":"riak_kv_mapreduce",
"function":"map_identity"}
},
{"reduce":{
"language":"erlang",
"module":"riak_kv_mapreduce",
"function":"reduce_count_inputs"}
}
]}' -H "Content-Type: application/json" http://riak01:8098/mapred
但是,在旋转几分钟后,我收到以下错误:
{"phase":0,"error":"[{vnode_proxy_timeout,{251195593916248939066258330623111144003363405824,'riak@10.40.239.99'}}]","input":"{ok,{r_object,<<\"mybucket\">>,<<\"oneofmykeys\">>,[{r_content,{dict,6,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[[<<\"content-type\">>,(mycontenttype)],[<<\"X-Riak-VTag\">>,53,116,122,97,99,76,103,112,51,115,50,79,90,71,53,80,89,81,116,119,105,54]],[[<<\"index\">>]],[],[[<<\"X-Riak-Last-Modified\">>|{1383,386589,424337}]],[],[[<<\"X-Riak-Meta\">>,{<<\"...\">>,<<\"...\">>}],...]}}},...}],...},...}","type":"result","stack":"[{gen,do_call,4,[{file,\"gen.erl\"},{line,234}]},{riak_core_vnode_proxy,call,2,[{file,\"src/riak_core_vnode_proxy.erl\"},{line,109}]},{riak_pipe_vnode,queue_work_send,4,[{file,\"src/riak_pipe_vnode.erl\"},{line,333}]},{riak_pipe_vnode,queue_work_erracc,6,[{file,\"src/riak_pipe_vnode.erl\"},{line,281}]},{riak_kv_mrc_map,send_results,2,[{file,\"src/riak_kv_mrc_map.erl\"},{line,232}]},{riak_pipe_vnode_worker,process_input,3,[{file,\"src/riak_pipe_vnode_worker.erl\"},{line,445}]},{riak_pipe_vnode_worker,wait_for_input,...},...]"}
我意识到遍历整个存储桶的键可能会很慢,但我想要一些保证,在紧要关头,我可以通过某种方式映射整个存储桶。 如何解决 vnode_proxy_timeout 错误?
最佳答案
“vnode_proxy_timeout”不能按照“thesam”的建议指定。这是错误的 - 没有任何东西会从 HTTP 请求中读取它。
vnode_proxy_timeout 仅从 Riak 内部的一个地方抛出:
https://github.com/basho/riak_pipe/blob/develop/src/riak_pipe_vnode.erl#L342
这是这里发生的 gen_server 超时的重新抛出:
https://github.com/basho/riak_core/blob/develop/src/riak_core_vnode_proxy.erl#L109
由于来自 Riak 的 gen:call 没有指定超时,gen 默认为 5s。 https://github.com/erlang/otp/blob/maint/lib/stdlib/src/gen.erl#L146
不幸的是,如果不更改和编译 Riak 源代码,就无法更改此设置。
如果您使用范围搜索作为 Map-Reduce 作业的输入,请考虑将范围拆分为多个不重叠的子范围。比方说,如果你想使用 [a-z] 范围内的键映射 reduce 数据,那么按顺序执行多个 map reduce 调用。例如,[a-e]、[e-h]、[i-s]、[t-z] 中的每一个。
使用这种方法,如果其中一个子范围 MR 作业失败,比如说 [i-s] 超时,您只需要重新运行 [i-s] 的 mapreduce 而不是所有输入数据 [a-z]。分而治之。
关于riak - 在大 riak mapreduce 中克服 vnode_proxy_timeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20011551/