MapReduce是单线程的,性能很差?是这样的吗?

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

SMILET
浏览 166回答 2
2回答

犯罪嫌疑人X

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

慕娘9325324

之前使用MapReduce做过类似的事情,因为耗时,后来修改成使用聚合查询做统计,具体示例如下:>&nbsp;db.user.findOne() {&nbsp;&nbsp;&nbsp;&nbsp;"_id"&nbsp;:&nbsp;ObjectId("557a53e1e4b020633455b898"),&nbsp;&nbsp;&nbsp;&nbsp;"accountId"&nbsp;:&nbsp;"55546fc8e4b0d8376000b858",&nbsp;&nbsp;&nbsp;&nbsp;"tags"&nbsp;:&nbsp;[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"金牌会员",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"钻石会员",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"铂金会员",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"高级会员" &nbsp;&nbsp;&nbsp;&nbsp;] }基本的文档model如上,我在accountId和tags上做了索引db.user.ensureIndex({"accountId":1,&nbsp;"tags":1})现在要求统计用户下面的tags,MapReduce设计如下:var&nbsp;mapFunction&nbsp;=&nbsp;function()&nbsp;{&nbsp;&nbsp;&nbsp;if(this.tags){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;idx&nbsp;=&nbsp;0;&nbsp;idx&nbsp;<&nbsp;this.tags.length;&nbsp;idx++)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;tag&nbsp;=&nbsp;this.tags[idx]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;emit(tag,&nbsp;1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;} };var&nbsp;reduceFunction&nbsp;=&nbsp;function(key,&nbsp;values)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;cnt=0;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;values.forEach(function(val){&nbsp;cnt+=val;});&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;cnt; }; db.user.mapReduce(mapFunction,reduceFunction,{out:"mr1"})&nbsp;&nbsp;&nbsp;&nbsp;//输出到集合mr1中结果:>&nbsp;db.mr1.find().pretty() {&nbsp;"_id"&nbsp;:&nbsp;"金牌会员",&nbsp;"value"&nbsp;:&nbsp;9000&nbsp;} {&nbsp;"_id"&nbsp;:&nbsp;"钻石会员",&nbsp;"value"&nbsp;:&nbsp;43000&nbsp;} {&nbsp;"_id"&nbsp;:&nbsp;"铂金会员",&nbsp;"value"&nbsp;:&nbsp;90000&nbsp;} {&nbsp;"_id"&nbsp;:&nbsp;"铜牌会员",&nbsp;"value"&nbsp;:&nbsp;3000&nbsp;} {&nbsp;"_id"&nbsp;:&nbsp;"银牌会员",&nbsp;"value"&nbsp;:&nbsp;5000&nbsp;} {&nbsp;"_id"&nbsp;:&nbsp;"高级会员",&nbsp;"value"&nbsp;:&nbsp;50000&nbsp;}看似达到我们的效果, 我只是拿少量的数据10W做的上面的测试, 执行的过程中,它会输出:>&nbsp;db.mapReduceTest.mapReduce(mapFunction,reduceFunction,{out:"mr1"}){&nbsp;&nbsp;&nbsp;&nbsp;"result"&nbsp;:&nbsp;"mr1",&nbsp;&nbsp;&nbsp;&nbsp;"timeMillis"&nbsp;:&nbsp;815,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//耗时多久 &nbsp;&nbsp;&nbsp;&nbsp;"counts"&nbsp;:&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"input"&nbsp;:&nbsp;110000,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//扫描的文档数量 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"emit"&nbsp;:&nbsp;200000,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//mongo执行计算的次数 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"reduce"&nbsp;:&nbsp;2001,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"output"&nbsp;:&nbsp;6 &nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;&nbsp;&nbsp;&nbsp;"ok"&nbsp;:&nbsp;1}因为我mock的数据比较简单有规律,可以看出它的计算次数几乎是扫描的文档数量的二倍,后来使用随机的数据做测试,发现结果更糟糕,果断放弃MapReduce的实现,改用其他实现。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MongoDB