Преодоление vnode_proxy_timeout в большой карте
У меня есть ведро с риаком, которое содержит примерно 16 миллионов записей. Я пытаюсь промокнуть ногами с помощью 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?
2 ответа
"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
Поскольку gen:call от Riak не указывает время ожидания, по умолчанию для gen задано значение 5 с. https://github.com/erlang/otp/blob/maint/lib/stdlib/src/gen.erl#L146
К сожалению, нет способа изменить это без изменения и компиляции исходного кода Riak.
Если вы используете поиск диапазона в качестве входных данных для задания Map-Reduce, рассмотрите возможность разделения диапазона на несколько непересекающихся поддиапазонов. Скажем, если вы хотите отобразить сокращение по данным с ключами в диапазоне [az], то сделайте это последовательно, как несколько вызовов преобразования карты. Например, для каждого из [ae], [eh], [is], [tz].
При таком подходе в случае сбоя одного из заданий MR в поддиапазоне, скажем, времени ожидания [is], вам нужно только повторно выполнить mapreduce of [is], а не все ваши входные данные [az]. Разделяй и властвуй.
Таким же образом, как вы установили время ожидания, вы можете установить vnode_proxy_timeout. Например:
{
"inputs": "mybucket",
"vnode_proxy_timeout": 99999999,
...