riak - 在大 riak mapreduce 中克服 vnode_proxy_timeout

标签 riak

我有一个 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/

相关文章:

mongodb - riak 搜索 mongodb 索引之间的区别

nosql - Riak:如果目标被删除,链接会消失吗?

mongodb - 使用基于文档的 nosql(mongodb、couchdb 和 riak 等)查询关系数据的性能

java - 从 Clojure 捕获 riak-java-client 的特定异常

java - Riak 和 Java - com.fasterxml.jackson.core.JsonParseException : Unexpected character ('<' (code 60))

python - Riak,如何删除已在使用的索引?

erlang - 启动时 Riak erlang 错误

riak - 如何在 Riak 中构建数据?

erlang - 如何列出riak中所有的bucket类型?

java - Riak-Java 无法从 Scala 中的 MapReduce 查询反序列化域对象?