【问题标题】:Mongo map/reduce slowdown on large collectionsMongo 映射/减少大型集合的减速
【发布时间】:2012-05-30 09:21:46
【问题描述】:

我们有一个看似简单的 map/reduce 作业,它每天都会记录数据。在开发服务器上,我们可以在非常多的文档上运行这个作业,大约 1M,并且大约需要一分钟,没有任何问题。我们将作业转移到生产服务器,即 Amazon EC2 服务器,作业将以非常快的速度遍历大约 50% 的行,然后抓取其余数据。浏览几十万个文档可能需要几个小时,而不是预期的一两分钟。所以我希望我们在 map/reduce 工作中犯了一个明显的错误。

这是一个示例输入文档:

{ “_id”:ObjectId(“4f147a92d72b292c02000057”), “cid”:25, “IP”:“123.45.67.89”, "b" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7", “r”:“”, "l" : "en-US,en;q=0.8", "ts" : ISODate("2012-01-16T19:29:22Z"), “s”:0, “简历”:“4f143a5fd72b292d7f000007”, “C” : ”” }

我们只查询 _id 的范围。

这里是地图代码:

功能() { 变量浏览器 = {} ,推荐人 = {}; 浏览器[this.b] = { “计数”:1 }; 推荐人[this.r] = { “计数”:1 }; 变量 objEmit = { “计数”:1 ,'浏览器' : 浏览器 ,'推荐人' : 推荐人 }; var date = this._id.getTimestamp(); date.setHours(0); date.setMinutes(0); date.setSeconds(0); 发射({'cv':this.cv,'date':日期,'cid':this.cid},objEmit); };

这是reduce代码:

功能(键,发射){ 变量总计 = 0 ,浏览器 = {} ,推荐人 = {}; for (var i in emits) { 总计 += 发出 [i].count; for (var key in emits[i].browsers) { 如果(发射[i].browsers.hasOwnProperty(键)){ !(browsers[key]) && (browsers[key] = { count : 0 }); browsers[key].count += emits[i].browsers[key].count; } } for (var key in emits[i].referrers) { if (emits[i].referrers.hasOwnProperty(key)) { !(referrers[key]) && (referrers[key] = { count : 0 }); referrers[key].count += emits[i].referrers[key].count; } } } return {'count':总数,'browsers':浏览器,'referrers':referrers} };

没有最终确定,我们将 map/reduce 作业输出到现有集合,并将“合并”选项设置为 true。

非常感谢任何帮助。

【问题讨论】:

    标签: mongodb mapreduce


    【解决方案1】:

    由于它是在开发和生产中运行的相同代码,并且您在非常大的集合上在开发中运行它并且返回速度非常快,您怀疑您的代码可能有问题的任何特定原因?

    您是否有可能在微型实例上运行?如果你不知道,Micro instances cap average CPU usage 这可能会破坏你的 Map-Reduce 活动,因为它会导致大量数据在不被允许处理的情况下建立起来(I/O 没有以同样的方式被限制) ,因此它不断出现,然后 Linux 内核将大部分时间用于管理它并使事情变得更糟)。

    从 Micro 切换到 Small,即使 CPU 速度较低,也可能对您有所帮助,因为您有一个恒定的 CPU 周期“流”可以使用(就像普通机器一样),并且 MongoDB 的内部调度可能会更好地适应。

    这在以前可能不是问题,因为正常的查询“峰值”不会持续足够长的时间导致 CPU 限制开启。

    【讨论】:

    • 谢谢。 CPU 使用率似乎确实与生产有关,因此这可能是正确的。据说我们使用的不是微型实例,而是“超大内存双倍”。
    • 你的开发机器有什么样的规格?这种实例不应该有这些问题。我还将研究 MongoDB 在开发与生产中的设置。它们是相同的版本、相同的设置、相同的架构(开发和生产都是 64 位)吗?
    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2014-09-20
    相关资源
    最近更新 更多