2013-02-27 49 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