2013-07-23 2 views
0

Я новичок в 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 

Я считаю, что здесь что-то не хватает. Возможно, это вопрос конфигурации? Это очень простой запрос. Я, очевидно, хочу перейти к более сложным запросам, когда это работает.

ответ

1

Ваше задание mapreduce указывает a Riak Search query as input, и это не удастся, если у вас нет Riak Search enabled в вашем кластере. Есть несколько примеров, доступных в the Java client documentation, которые показывают, как можно указать различные типы ввода.

Сказав это, Riak MapReduce не был предназначен для обработки запросов в реальном времени, поэтому я не уверен, что это правильный инструмент для того, что вы пытаетесь выполнить. По сравнению с прямым поиском по ключевым словам он значительно увеличивает нагрузку на систему, так как большое количество узлов/разделов должно участвовать в каждом запросе. Это приводит к более высоким задержкам, а также означает, что он имеет тенденцию не масштабироваться, а также прямой доступ к ключам.

При моделировании данных для Riak и других хранилищ ключей, шаблонов доступа к данным и шаблонов запросов необходимо учитывать фронт вместе со структурой данных, что совершенно отличается от работы с реляционными моделями. Некоторые блоги и презентации, связанные с моделированием данных в Riak доступны здесь:

 Смежные вопросы

  • Нет связанных вопросов^_^