2013-02-27 78 views
1

我在MongoDB的樣本文件(和我還是新來的MongoDB)MongoDB的MapReduce的使用性能指標

{ 
    "ID": 0, 
    "Facet1":"Value1", 
    "Facet2":[ 
     { 
      "Facet2Obj1":{ 
       "Obj1Facet1":"Value11", 
       "Obj2Facet1":"Value21", 
       "Obj3Facet1":"Value31" 
      } 
     }, 
     { 
      "Facet2Obj2":{ 
       "Obj1Facet2":"Value12", 
       "Obj2Facet2":"Value22", 
       "Obj3Facet2":"Value32" 
      } 
     }, 
     { 
      "Facet2Obj3":{ 
       "Obj1Facet3":"Value13", 
       "Obj2Facet3":"Value23", 
       "Obj3Facet3":"Value33" 
      } 
     } 
    ], 
    "Facet3":"Value3" 
    "Facet4":{ 
     "Facet4Obj1":{ 
      "Obj1Facet1":"Value4111" 
     } 
    } 
} 

MapReduce的是一個有點複雜,它提供了以下輸出中(30000個文檔):

{ 
    "_id" : "Facet1", 
    "value" : [ 
     { 
      "value" : "Value1", 
      "count" : 30000, 
      "ID" : [ 
       0, 
       1, 
      . 
       . 
       . 
      ] 
     } 
    ] 
} 
{ 
    "_id" : "ID", 
    "value" : [ 
     { 
      "value" : 0, 
      "count" : 1, 
      "ID" : [ 
       0 
      ] 
     }, 
     { 
      "value" : 1, 
      "count" : 1, 
      "ID" : [ 
       1 
      ] 
     }, 
     . 
     . 
     . 
    ] 
} 
{ 
    "_id" : "Facet2", 
    "value" : [ 
     { 
      "value" : "Facet2Obj1", 
      "count" : 30000, 
      "ID" : [ 
       0, 
       1, 
       . 
       . 
       . 
      ] 
     }, 
     { 
      "value" : "Facet2Obj2", 
      "count" : 30000, 
      "ID" : [ 
       0, 
       1, 
       . 
       . 
       . 
      ] 
     }, 
     { 
      "value" : "Facet2Obj3", 
      "count" : 30000, 
      "ID" : [ 
       0, 
       1, 
       . 
       . 
       . 
      ] 
     } 
    ] 
} 
{ 
    "_id" : "Facet3", 
    "value" : [ 
    { 
      "value" : "Value3", 
     "count" : 30000, 
      "ID" : [ 
       0, 
       1, 
       2, 
       . 
       . 
       . 
      ] 
     } 
    ] 
} 
{ 
    "_id" : "Facet4", 
    "value" : [ 
     { 
      "value" : "Facet4Obj1", 
      "count" : 30000, 
      "ID" : [ 
       0, 
       1, 
       2, 
       . 
       . 
       . 
      ] 
     } 
    ] 
} 

我使用格式(使用不同ID)插入30,000個文檔到mongodb中,然後我做了一個map-reduce,但速度很慢。有了30,000個文檔,大約需要30分鐘,但是隨後我將這些索引加上了一些快速的部分,比如需要350秒,但是又有50,000個文檔需要大約30分鐘。當我檢查使用db.collection.getIndexes()的MongoDB將返回此輸出指標:

{ 
    "v" : 1, 
    "key" : { 
     "_id" : 1 
    }, 
    "ns" : "database.collection", 
    "name" : "_id_" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "ID" : 1, 
     "Facet1" : 1, 
     "Facet2" : 1, 
     "Facet3" : 1, 
     "Facet4" : 1 
    }, 
    "ns" : "database.collection", 
    "name" : "ID_1_Facet1_1_Facet2_1_Facet3_1_Facet4_1" 
} 

有什麼我沒有錯的地圖,減少指標仍然不夠快,因爲索引必須是戰略性的地方或性能輸出會相反

答案是極大的讚賞和感謝提前

+0

MR無法使用索引 – Sammaye 2013-02-27 09:15:47

+0

您傳遞給mapReduce的查詢是什麼?你一般用mapReduce做什麼?它總是比聚合或運行在服務器而不是Javascript中的其他類型的操作慢 – 2013-02-27 12:29:45

+0

如果MR不能使用索引,那麼爲什麼它變得更快一點? ,沒有使用查詢,因此所有30,000個文檔都被傳遞給mapreduce。是的,有關於mapreduce性能的主題,但是50,000個文檔是否不足以使mapreduce大約半小時?還是取決於地圖精簡工作的複雜程度? – megamoth 2013-02-28 05:13:29

回答

4

的MapReduce傳遞一個集合中的每個文件到地圖功能除了如果你傳遞{查詢:}它將使用「預」選項 - 過濾文件發送到MapReduce的。您還可以將{sort:}選項傳遞給mapReduce,並將文檔發送到映射函數,該函數按照該字段排序。

這是索引將被使用的唯一兩個地方 - 之後,所有事情都發生在爲工作而產生的Javascript線程中。

+0

我已經閱讀了關於充分利用MapReduce的博客,他提出的一點是關於使用排序選項,我可以使用上述mapReduce格式的排序選項嗎?或者mapreduce操作的哪一部分是使用的排序選項?或者當它在過程中使用? 格式類似'{「_id」:「」,「value」:[{},{},...]}',我可以使用排序選項排序'value'數組中的值嗎? – megamoth 2013-03-02 01:07:41

+0

不,它只是指示在通過地圖功能發送所有文檔時應該使用什麼順序。 – 2013-03-02 01:49:51

+0

這也是我誤解的事情,這可能是一種啓示,謝謝,但我會在完成實施後接受這個答案。 – megamoth 2013-03-02 10:21:11