我必须执行一个启动大量Map / Reduce(~400)的操作,但每个Map / Reduce都在不同的集合上,所以它不能是任何并发写入。
为了提高这个操作的性能,我通过在每个Map / Reduce的应用程序端(我使用Java驱动程序)创建一个线程来使它瘫痪(注意我不使用分片模式)。
但是当我比较结果时,我最终得到了一些带有顺序执行(单线程)的最差结果。 更确切地说:顺序执行为341秒,分布式执行为904。 因此,与其获得更好的执行时间相比,它的时间要长三倍。
有人知道为什么mongoDB不喜欢Map / Reduce流程的并行化?
我发现了一篇关于它的文章(link),但是现在mongoDB使用了V8引擎,我认为应该没问题。
答案 0 :(得分:0)
首先,在不同的数据库中执行Map / Reducing,每个数据库都有锁(现在版本为2.6)。 其次,需要更多的RAM和更快的磁盘IO,可能存在瓶颈。
以下是有关如何使用多核的示例。 http://edgystuff.tumblr.com/post/54709368492/how-to-speed-up-mongodb-map-reduce-by-20x “问题在于线程之间存在太多的锁争用。当锁定时,MR不是非常无私的(它会产生每1000个读取),并且由于MR作业也会进行大量写入,因此线程最终会相互等待。 MongoDB每个数据库都有单独的锁“