毎日データをログに記録する、一見シンプルなmap/reduceジョブがあります。開発サーバーでは、このジョブを非常に多くのドキュメント(約100万)に対して実行でき、問題なく約1分かかります。ジョブをAmazonEC2サーバーである本番サーバーに移動します。ジョブは非常に高速で行の約50%をクランキングし、残りのデータをクロールします。予想される1〜2分ではなく、数十万のドキュメントを処理するのに数時間かかる場合があります。ですから、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、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の範囲のみを照会します。
マップコードは次のとおりです。
働き() {
var browser = {}
、referrer = {};
browser [this.b] = {
'カウント':1
};
リファラー[this.r]={
'カウント':1
};
var objEmit = {
'カウント':1
、「ブラウザ」:ブラウザ
、'リファラー':リファラー
};
var date = this._id.getTimestamp();
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
放出({'cv':this.cv、'date':date、'cid':this.cid}、objEmit);
};
削減コードは次のとおりです。
関数(キー、放出){
var total = 0
、ブラウザ= {}
、referrers = {};
for(var i in排出){
合計+=排出量[i].count;
for(var key in Emmits [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 Emmits [i] .referrers){
if(emits [i] .referrers.hasOwnProperty(key)){
!(referrers [key])&&(referrers [key] = {count:0});
referrers [key] .count+=はemits[i].referrers [key] .count;
}
}
}
return {'count':合計、'ブラウザ':ブラウザ、'リファラー':リファラー}
};
ファイナライズせず、「merge」オプションをtrueに設定して、map/reduceジョブを既存のコレクションに出力します。
どんな助けでも大歓迎です。