我们有一个看似简单的地图/ 递减任务, 每天通过记录数据。 在开发服务器上, 我们可以在大量文件上运行这个任务, 包括 ~ 1M, 并且没有问题。 我们把工作转到生产服务器上, 即 亚马逊 EC2 服务器, 工作将以非常快的速度通过50%左右的行, 然后爬过其余的数据 。 它需要几个小时才能通过几十万个文件, 而不是预期的分钟或两分钟 。 所以我希望我们在地图/ 降级工作中 犯了一个明显的错误 。
以下是一个样本输入文件:
{ "_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, "cv" : "4f143a5fd72b292d7f000007", "c" : "" }
我们只查询 _id s 的范围。
这是地图代码:
function() { var browser = {} ,referrer = {}; browser[this.b] = { count : 1 }; referrer[this.r] = { count : 1 }; var objEmit = { count : 1 , browsers : browser , referrers : referrer }; var date = this._id.getTimestamp(); date.setHours(0); date.setMinutes(0); date.setSeconds(0); emit({ cv : this.cv, date : date, cid : this.cid }, objEmit); };
以下是下限代码:
function (key, emits) { var total = 0 ,browsers = {} ,referrers = {}; for (var i in emits) { total += emits[i].count; for (var key in emits[i].browsers) { if (emits[i].browsers.hasOwnProperty(key)) { !(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 : total, browsers : browsers, referrers : referrers} };
没有最终确定, 我们将地图/ 减少任务输出到已有的收藏, 使用“ 合并” 选项设置为真实 。
非常感谢任何帮助。