Не удалось использовать уменьшение карты с риаком

Я новичок в Риаке, так что прошу прощения за мое недоразумение.

Я могу добавлять новые записи и выполнять запросы по ключу и индексу. Однако я должен реализовать более сложные запросы, поэтому я пытаюсь использовать 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 DB:

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 ("name: \" volume \ "","name: \" volume \ '"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 в качестве входных данных указывается запрос поиска Riak, и это не удастся, если в вашем кластере не включен поиск Riak. В документации клиента Java есть несколько примеров, показывающих, как могут быть указаны различные типы ввода.

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

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

Другие вопросы по тегам