nosql - MongoDB的MR问题!
怪我咯
怪我咯 2017-04-21 11:16:15
0
3
772

听说mongodb的MapReduce是单线程的,性能很差,这是怎么回事?差到什么程度呢??有哪位大侠能说说原理。

怪我咯
怪我咯

走同样的路,发现不同的人生

membalas semua(3)
洪涛

Saya tidak tahu sama ada pelaksanaan di dalam adalah satu-benang, tetapi jika ia adalah persekitaran pengeluaran, adalah lebih baik untuk tidak mengakses terus hasil mapReduce setiap kali Bergantung pada saiz data, ia masih akan mengambil masa jangka masa tertentu. Data kami berjumlah berpuluh-puluh juta, dan setiap pelaksanaan mapReduce mengambil masa kira-kira 5-6 saat Mujurlah, aplikasi kami bukan masa nyata. Jadi pada asasnya data dicache selama 2 jam, dan kemudian mapReduce dilaksanakan untuk mendapatkan hasil terkini.

左手右手慢动作

Saya rasa artikel ini akan menerangkan isu prestasi mongodb!
http://stackoverflow.com/questions/39...

伊谢尔伦

Saya telah melakukan perkara yang sama sebelum menggunakan MapReduce Kerana ia memakan masa, saya kemudiannya mengubah suai untuk menggunakan pertanyaan agregat untuk statistik adalah seperti berikut:

> db.user.findOne()
{
    "_id" : ObjectId("557a53e1e4b020633455b898"),
    "accountId" : "55546fc8e4b0d8376000b858",
    "tags" : [
        "金牌会员",
        "钻石会员",
        "铂金会员",
        "高级会员"
    ]
}

Model dokumen asas adalah seperti di atas, saya mengindeks pada accountId dan teg

db.user.ensureIndex({"accountId":1, "tags":1})

Kini ia dikehendaki mengira teg di bawah pengguna direka bentuk seperti berikut:

var mapFunction = function() {
   if(this.tags){
       for (var idx = 0; idx < this.tags.length; idx++) {
           var tag = this.tags[idx];
           emit(tag, 1);
       }
   }
};

var reduceFunction = function(key, values) {
    var cnt=0;   
    values.forEach(function(val){ cnt+=val;});  
    return cnt;
};


db.user.mapReduce(mapFunction,reduceFunction,{out:"mr1"})    //输出到集合mr1中

Keputusan:

> db.mr1.find().pretty()
{ "_id" : "金牌会员", "value" : 9000 }
{ "_id" : "钻石会员", "value" : 43000 }
{ "_id" : "铂金会员", "value" : 90000 }
{ "_id" : "铜牌会员", "value" : 3000 }
{ "_id" : "银牌会员", "value" : 5000 }
{ "_id" : "高级会员", "value" : 50000 }

Nampaknya telah mencapai kesan kami. Saya hanya menggunakan sedikit data 10W untuk melakukan ujian di atas semasa proses pelaksanaan, ia akan mengeluarkan:

> db.mapReduceTest.mapReduce(mapFunction,reduceFunction,{out:"mr1"})
{
    "result" : "mr1",
    "timeMillis" : 815,                   //耗时多久
    "counts" : {
        "input" : 110000,             //扫描的文档数量
        "emit" : 200000,              //mongo执行计算的次数
        "reduce" : 2001,
        "output" : 6
    },
    "ok" : 1
}

Oleh kerana data olok-olok saya agak mudah dan teratur, dapat dilihat bahawa bilangan pengiraan adalah hampir dua kali ganda daripada jumlah dokumen yang diimbas Kemudian, saya menggunakan data rawak untuk ujian dan mendapati keputusannya lebih teruk. Saya dengan tegas melepaskan pelaksanaan MapReduce dan menukar Gunakan pelaksanaan lain.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan