Преодоление 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,
...
Другие вопросы по тегам