【问题标题】:MongoDB - How does locking work for Map Reduce?MongoDB - Map Reduce 的锁定如何工作?
【发布时间】:2012-04-09 20:38:47
【问题描述】:

MongoDB map reduce 在对集合执行操作时会锁定集合吗?

我有一些被应用程序广泛和密集使用的集合。 Map/Reduce 每 10 分钟通过一个 cron 作业在后台运行一次,在该广泛和密集使用的集合上运行。

我想知道 Map/Reduce 是否很有可能无法正常执行,因为该集合上正在进行其他操作(插入、更新和主要读取)。特别是,我想知道 Map/Reduce 是否会干扰用户对集合执行的正常操作。

【问题讨论】:

标签: mongodb cron mapreduce


【解决方案1】:

MapReduce,如果输出到一个集合将在它写入时需要多个写锁(就像任何创建/更新集合的操作一样)。如果您正在执行内联 MR,那么您可以避免这种锁定(但对结果大小有限制)。即便如此,仍然存在读锁和 Javascript 锁(目前 mongoDB 上的服务器端 JS 是单线程的)。

这里都有解释(如果有变化会更新):

http://www.mongodb.org/display/DOCS/How+does+concurrency+work#Howdoesconcurrencywork-MapReduce

注意:如果您担心多线程,则需要注意 SpiderMonkey 到 V8 JS 引擎的迁移问题。

【讨论】:

  • 如果我理解正确,当 mapreduce 完成工作并且正在“temp_result_collection”上输出时,在那个即时 mongodb 锁定和同时其他操作的请求在队列中,因为 mapreduce 输出完成?但是如果输出需要几秒钟(例如 10 秒,因为它是大输出),这不是问题。但是,当 mapreduce 从集合中读取数据进行处理时(运行发射和减少函数),它会保留初始集合的锁定吗?我问这个是因为我在 mongodb 中实现了一个投票系统,并且我将投票存储为 diff 集合中每个对象的嵌套文档
  • “它从一个集合中读取(每 100 个文档产生读取锁)”因此,如果用户同时查询其中一个被锁定的记录,用户等待直到它在 100 个文档上被释放?,所以用户执行的读取操作它被放入队列中,所以它不会返回错误,对吧?
  • 首先,要充分利用 yield,请确保您使用的是 2.x 版本(当前为 2.0.4),该版本已改进了 yield。 100 个文档不是一个锁定单元,而是 MR 作业取出一个读锁(允许多个读锁)并每 100 个文档产生一次。为什么?因为写锁是独占的,所以如果一个写正在等待,yield 将允许该写发生。请查看 Dwight 在 10gen.com 上的演示,了解有关所有这些工作原理的更详细和信息丰富的说明。
猜你喜欢
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
相关资源
最近更新 更多