当我尝试运行查询mapreduce时,Riak返回错误[preflist_exhausted]。在console.log中有一个警告:
riak_kv_vnode:do_get_object:1300 Reading large object of size 8360185.
我存储在Riak大对象中(最多20 MB)。是否有一个设置可以对这个大小的对象执行mapreduce?
我的mapreduce:
{
"inputs":"myclients",
"query":
[{
"map":
{
"language":"javascript",
"source":"function(riakObject){ return [1]; }"
}
},{
"reduce":{
"language":"javascript",
"source":"function(values,arg){ return [values.reduce(function(acc,item){ return acc + item;},0)] ;}"
}
}]
}
答案 0 :(得分:0)
Riak对于大于几兆字节的对象表现不佳。映射阶段将从后端读取每个对象并将其传递给map函数,其中任何非平凡数量的键均为20Mb,在超时之前不太可能完成。用于读取映射阶段的数据的折叠可能会导致vnode过载,这会使其显示为脱机,从而导致preflist_exhausted
消息。
Reading large object
消息是一条信息性消息,通知您已读取大于已配置阈值的对象。这是为了提醒您可能会影响性能的大小的对象。
如果必须存储该大小的值,则应考虑将它们分成块并将每个块存储在单独的密钥中。可能有一个存储桶,其中包含一个表示整体值的键,并包含需要检索以重新组合对象的块键/值列表。
如果值是面向文件的,请考虑使用Riak CS,它将大型对象分解为1Mb块进行存储。