这个Riak Map Reduce查询需要多长时间?



我有一个大约有900,000条记录的桶。这些记录中的大多数在二级索引中具有持久化状态。我想检索所有的base_url,并计算每个base_url中有多少文档属于所有标记为持久化的文档。

下面是查询:

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分钟后超时。

我在一个16核3Ghz的AWS节点上,内存为20Gb。

是否有一些东西,我可能做错了,无论是与我的配置或与上述查询?

有可能花这么长时间吗?

为了给出透视图,MySQL中的等效查询看起来像这样

SELECT COUNT(*), catalog FROM urls GROUP BY catalog;

我没有尝试过,但我怀疑在MySQL中,从上面的查询超过900,000条记录的结果集将花费几秒钟。我无意将Riak与MySQL进行比较,因为我意识到它们非常不同,但我想知道我如何至少在10分钟内执行上述查询。

谢谢!

Riak中的JavaScript MapReduce作业使用一个SpiderMonkey JavaScript vm池,根据您的使用模式调整这个池的大小是很重要的,以避免或至少减少争用。池的大小通过app.config文件中的map_js_vm_count和reduce_js_vm_count参数指定。

由于您在单个节点上运行并且只有一个map阶段,我建议您将'map_js_vm_count'参数设置为您的环的大小,默认情况下为64。在这里可以找到更深入的描述。

虽然map阶段处理很容易扩展并且是并行完成的,但是中央reduce阶段很容易成为瓶颈,因为它是在单个节点上递归运行的。这可以通过向map阶段传递一个参数来解决,以启用预减少和增加减少阶段的批大小,如下所述。启用pre-reduce将允许reduce阶段的第一次迭代并行运行,这很可能会提高作业的效率。但是,您需要通过增加'reduce_js_vm_count'参数来增加可用于减少相位函数的虚拟机数量。

如果并发运行大型MapReduce作业,需要的JavaScript虚拟机数量可能会变得相当大。通常鼓励将map和reduce阶段函数转换为Erlang,因为它可以消除JS VM争用,并且由于VM相关开销较少而性能更好。对于您打算定期运行的MapReduce作业,总是建议这样做。

最新更新