Riak返回错误"读取大小的大对象......"当mapreduce

时间:2014-06-24 14:25:00

标签: riak

当我尝试运行查询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)] ;}"
        }
     }]
}

1 个答案:

答案 0 :(得分:0)

Riak对于大于几兆字节的对象表现不佳。映射阶段将从后端读取每个对象并将其传递给map函数,其中任何非平凡数量的键均为20Mb,在超时之前不太可能完成。用于读取映射阶段的数据的折叠可能会导致vnode过载,这会使其显示为脱机,从而导致preflist_exhausted消息。

Reading large object消息是一条信息性消息,通知您已读取大于已配置阈值的对象。这是为了提醒您可能会影响性能的大小的对象。

如果必须存储该大小的值,则应考虑将它们分成块并将每个块存储在单独的密钥中。可能有一个存储桶,其中包含一个表示整体值的键,并包含需要检索以重新组合对象的块键/值列表。

如果值是面向文件的,请考虑使用Riak CS,它将大型对象分解为1Mb块进行存储。