nosql - MongoDB的MR问题!

浏览:54日期:2023-07-18

问题描述

听说mongodb的MapReduce是单线程的,性能很差,这是怎么回事?差到什么程度呢??有哪位大侠能说说原理。

问题解答

回答1:

里面执行是否是单线程我不知道, 但是, 如果是生产环境的话, 最好还是别每次直接去访问mapReduce 的结果,根据数据量的大小,还是会花费一定的时间的。我们的数据是千万级别, 每次执行mapReduce,大概需要5-6秒时间, 还好我们的应用不是对实时性很高。 所以基本上是缓存2个小时的数据, 然后在去执行mapReduce 获取最新的结果。

回答2:

我想mongodb的性能问题,就用这篇文章来解释吧!http://stackoverflow.com/questions/39...

回答3:

之前使用MapReduce做过类似的事情,因为耗时,后来修改成使用聚合查询做统计,具体示例如下:

> db.user.findOne(){ '_id' : ObjectId('557a53e1e4b020633455b898'), 'accountId' : '55546fc8e4b0d8376000b858', 'tags' : ['金牌会员','钻石会员','铂金会员','高级会员' ]}

基本的文档model如上,我在accountId和tags上做了索引

db.user.ensureIndex({'accountId':1, 'tags':1})

现在要求统计用户下面的tags,MapReduce设计如下:

var mapFunction = function() { if(this.tags){ for (var idx = 0; idx < this.tags.length; idx++) { var tag = this.tags[idx]; emit(tag, 1); } }};var reduceFunction = function(key, values) { var cnt=0; values.forEach(function(val){ cnt+=val;}); return cnt;};db.user.mapReduce(mapFunction,reduceFunction,{out:'mr1'}) //输出到集合mr1中

结果:

> db.mr1.find().pretty(){ '_id' : '金牌会员', 'value' : 9000 }{ '_id' : '钻石会员', 'value' : 43000 }{ '_id' : '铂金会员', 'value' : 90000 }{ '_id' : '铜牌会员', 'value' : 3000 }{ '_id' : '银牌会员', 'value' : 5000 }{ '_id' : '高级会员', 'value' : 50000 }

看似达到我们的效果, 我只是拿少量的数据10W做的上面的测试, 执行的过程中,它会输出:

> db.mapReduceTest.mapReduce(mapFunction,reduceFunction,{out:'mr1'}){ 'result' : 'mr1', 'timeMillis' : 815, //耗时多久 'counts' : {'input' : 110000, //扫描的文档数量'emit' : 200000, //mongo执行计算的次数'reduce' : 2001,'output' : 6 }, 'ok' : 1}

因为我mock的数据比较简单有规律,可以看出它的计算次数几乎是扫描的文档数量的二倍,后来使用随机的数据做测试,发现结果更糟糕,果断放弃MapReduce的实现,改用其他实现。

相关文章: