这个地图了Riak应该多久减少查询时间?(How long should this Riak Map

2019-10-18 00:16发布

我有大约900 000项记录的水桶。 大多数的这些记录已经持续在二级索引中的地位。 我想检索所有base_urls和多少文件,属于各BASE_URL中标记PERSISTED所有文档计数。

下面是该查询:

curl -X POST -H "content-type: application/json" \
    http://localhost:8098/mapred?chunked=true --data @-<<\EOF
{
    "timeout":600000,
    "inputs":{
       "bucket":"test-bucket",
       "index":"status_bin",
       "key":"PERSISTED"
    },
    "query":[{
        "map":{
            "language":"javascript",
            "source":"
                function(value, keyData, arg) {
                    var data = Riak.mapValuesJson(value)[0];
                    var obj = {};
                    obj[data.base_url] = 1;
                    return [obj];
                }
            "
        }
    },
    {
        "reduce":{
            "language":"javascript",
            "source":"
                function(values, arg){ 
                    return [values.reduce(
                        function(acc, item){ 
                            for(var base_url in item){
                                if(acc[base_url]) {
                                    acc[base_url] = acc[base_url] + 1
                                } else {
                                    acc[base_url] = item[base_url];
                                }
                            }
                            return acc;
                        })
                    ];
                }
            "
        }
    }]

EOF

这10分钟后超时。

我与内存的20Gb 16核心3GHz的AWS节点上。

有什么,我可能做错了,无论是我的配置,或者与上述查询?

如果它有可能这么长时间?

为了让角度来看,在MySQL中相当于查询会是这个样子

SELECT COUNT(*),目录从URL中GROUP BY目录;

我还没有尝试过,但我怀疑,在MySQL从上述查询超过90万条记录的结果集将需要几秒钟。 我没有意思了Riak,因为我知道他们是非常不同的比较MySQL,但是我想知道我怎么能在最起码,在执行在10分钟以上查询。

谢谢!

Answer 1:

在JavaScript的了Riak MapReduce作业使用的SpiderMonkey的JavaScript虚拟机池,并且重要的是要调整该池根据您的使用模式,以避免或至少减少,竞争的规模。 池的大小是通过“map_js_vm_count”,并在app.config文件“reduce_js_vm_count”参数中指定。

当你在一个节点上运行,并且只有一个map阶段,我会建议你“map_js_vm_count”参数设置为你的戒指的大小,默认为64,更深入的描述可以在这里找到 。

虽然地图相加工规模容易且并行完成,中央减少相位很容易成为,因为这是在单个节点上运行递归的瓶颈。 这可以通过为地址传递参数到地图相位,以使预减少和在此描述增加减少相位批量大小 。 启用前减少将允许减少阶段的第一次迭代并行运行,其中最有可能会提高你的工作效率。 但是,您将需要增加虚拟机的可通过增大“reduce_js_vm_count”参数相当多的减少相功能的数量。

如果同时运行大型MapReduce工作的JavaScript虚拟机,以支持该所要求的数量会变得相当大。 转换地图和减少相功能为二郎一般鼓励,因为它没有消除JS VM争,也执行得更好,由于少VM相关的开销。 这始终是推荐你打算定期运行MapReduce作业。



文章来源: How long should this Riak Map Reduce query take?
标签: riak