3

我们有一个看似简单的 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);
};

这是减少代码:

功能(键,发射){
    变量总计 = 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。

任何帮助深表感谢。

4

1 回答 1

0

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

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

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

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

于 2012-05-23T19:34:11.543 回答