Я новичок в Riak, поэтому, пожалуйста, извините мое недоразумение.Не удалось использовать карту уменьшить с помощью riak
Я могу добавлять новые записи и выполнять запросы по ключевым словам и индексам. Однако мне приходится выполнять более сложные запросы, поэтому я пытаюсь использовать MapReduce
.
У меня есть уровень приложения объект с именем Volume
, что на данный момент имеет только простые поля:
public class Volume implements Comparable<Volume>, Serializable {
@RiakIndex(name = "id")
@JsonProperty("id")
private Integer id;
@RiakIndex(name = "name")
@RiakKey
private String name;
@RiakIndex(name = "created_at")
@JsonProperty("created_at")
private long createdAt;
// setters, getters....
}
Вот как добавить Volume
экземпляры в Riak БД:
IRiakClient riakClient = RiakFactory.httpClient();
Bucket bucket = riakClient.fetchBucket(bucketName).execute();
for (int i = 0; i < n; i++) {
int id = i;
ManagedVolume volume = new ManagedVolume();
volume.setCreatedAt(System.currentTimeMillis());
volume.setId(id);
volume.setName("volume" + i);
bucket.store(volume).execute();
}
Теперь я могу извлечь экземпляров без каких-либо проблем, как показано ниже.
Collection<String> col = backet.fetchIndex(IntIndex.named("id")).from(3).to(5).execute();
Но все попытки использовать MapReduce
неудачу:
String str = riakClient.mapReduce(bucketName, "name: volume1")
.addMapPhase(new NamedJSFunction("Riak.mapValuesJson")).
execute().getResultRaw();
Я пытался сделать это без добавления Riak.mapValuesJson
, попытался изменить запрос, чтобы использовать id
вместо name
и завернуть volume`` with quotes (
«имя: \» объем \ "" ,
"имя: \ '\' объем" etc.) but nothing helps. I always get HTTP status 500 and the following error:
{ "ошибка": "map_reduce_error"} `
Здесь нам трассировки стека:
Exception in thread "main" com.basho.riak.client.RiakException: java.io.IOException: {"error":"map_reduce_error"}
at com.basho.riak.client.query.MapReduce.execute(MapReduce.java:81)
at com.infinidat.riak.TryRiak.search(TryRiak.java:288)
at com.infinidat.riak.TryRiak.main(TryRiak.java:66)
Caused by: java.io.IOException: {"error":"map_reduce_error"}
at com.basho.riak.client.raw.http.ConversionUtil.convert(ConversionUtil.java:589)
at com.basho.riak.client.raw.http.HTTPClientAdapter.mapReduce(HTTPClientAdapter.java:386)
at com.basho.riak.client.query.MapReduce.execute(MapReduce.java:79)
... 2 more
Я нашел следующую запись в Riak's error.log
и аналогичную запись в console.log
.
2013-07-23 19:14:12.451 [error] <0.194.0> Supervisor riak_pipe_builder_sup had child undefined started with {riak_pipe_builder,start_link,undefined} at <0.18058.4> exit with reason {{modfun,riak_search,mapred_search,[<<"VolumeBucket">>,<<"name: 1">>]},error,badarg,[{ets,lookup,[schema_table,<<"VolumeBucket">>],[]},{riak_search_config,get_schema,1,[{file,"src/riak_search_config.erl"},{line,69}]},{riak_search_client,parse_query,3,[{file,"src/riak_search_client.erl"},{line,40}]},{riak_search,parse_query,3,[{file,"src/riak_search.erl"},{line,59}]},{riak_search,mapred_search,3,[{file,"src/riak_search.erl"},{line,46}]},{riak_kv_mrc_pipe,send_inputs,3,[{file,"src/riak_kv_mrc..."},...]},...]} in context child_terminated
Я считаю, что здесь что-то не хватает. Возможно, это вопрос конфигурации? Это очень простой запрос. Я, очевидно, хочу перейти к более сложным запросам, когда это работает.