搜尋

首頁  >  問答  >  主體

nosql - MongoDB的MR問題!

聽說mongodb的MapReduce是單線程的,性能很差,這是怎麼回事?差到什麼程度呢??有哪位大俠能說說原理。

怪我咯怪我咯2800 天前802

全部回覆(3)我來回復

  • PHP中文网

    PHP中文网2017-04-21 11:18:15

    裡面執行是否是單線程我不知道, 但是, 如果是生產環境的話, 最好還是別每次直接去訪問mapReduce 的結果,根據數據量的大小,還是會花費一定的時間的。我們的資料是千萬級別, 每次執行mapReduce,大概需要5-6秒時間, 還好我們的應用不是對即時性很高。 所以基本上就是快取2小時的數據, 然後在去執行mapReduce 取得最新的結果。

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-21 11:18:15

    我想mongodb的效能問題,就用這篇文章來解釋吧!
    http://stackoverflow.com/questions/39...

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-21 11:18:15

    之前使用MapReduce做過類似的事情,因為耗時,後來修改成使用聚合查詢做統計,具體範例如下:

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

    基本的文檔model如上,我在accountId和tags上做了索引

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

    現在要求統計使用者下面的tags,MapReduce設計如下:

    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中

    結果:

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

    看似達到我們的效果, 我只是拿少量的數據10W做的上面的測試, 執行的過程中,它會輸出:

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

    因為我mock的數據比較簡單有規律,可以看出它的計算次數幾乎是掃描的文檔數量的二倍,後來使用隨機的數據做測試,發現結果更糟糕,果斷放棄MapReduce的實現,改用其他實現。

    回覆
    0
  • 取消回覆