在mongoDB性能中并行化许多Map / Reduce作业

时间:2014-05-19 09:06:21

标签: multithreading performance mongodb mapreduce

我必须执行一个启动大量Map / Reduce(~400)的操作,但每个Map / Reduce都在不同的集合上,所以它不能是任何并发写入。

为了提高这个操作的性能,我通过在每个Map / Reduce的应用程序端(我使用Java驱动程序)创建一个线程来使它瘫痪(注意我不使用分片模式)。

但是当我比较结果时,我最终得到了一些带有顺序执行(单线程)的最差结果。 更确切地说:顺序执行为341秒,分布式执行为904。 因此,与其获得更好的执行时间相比,它的时间要长三倍。

有人知道为什么mongoDB不喜欢Map / Reduce流程的并行化?

我发现了一篇关于它的文章(link),但是现在mongoDB使用了V8引擎,我认为应该没问题。

1 个答案:

答案 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每个数据库都有单独的锁“