我是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....
}
以下是我向Riak DB添加Volume
个实例的方法:
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:
{”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的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
我相信我在这里缺少一些东西。可能是配置问题?这是一个非常简单的查询。一旦这个查询有效,我显然希望继续进行更复杂的查询。
答案 0 :(得分:1)
您的mapreduce作业指定a Riak Search query as input,如果您的群集中没有Riak Search enabled,则会失败。 the Java client documentation中提供了一些示例,说明了如何指定不同类型的输入。
话虽如此,Riak MapReduce并非设计为实时查询工具,所以我不确定它是否是您正在尝试完成的工具。与直接键值查找相比,它为系统增加了更多的负载,因为大量节点/分区需要参与每个请求。这会导致更高的延迟,也意味着它不会像直接密钥访问一样扩展。
当对Riak和其他键值存储进行数据建模时,数据访问模式和查询模式需要与数据结构一起预先考虑,与使用关系模型相比,这是非常不同的。有关Riak数据建模的一些博客文章和演示文稿可在此处获取: