分析在mongodb中正成为越来越重要的话题,因为它在越来越多的大型项目中使用。人们厌倦了使用不同的软件来做分析(包括hadoop),
分析在mongodb中正成为越来越重要的话题,因为它在越来越多的大型项目中使用。人们厌倦了使用不同的软件来做分析(包括hadoop),它们显然需要传输大量开销的数据。
mongodb提供了两种内置分析数据的方法:map reduce和aggregation框架。mr非常灵活,很容易部署。它通过分区工作良好,,并允许大量输出。mr在mongodb v2.4中,通过使用javascript引擎把spider monkey替换成v8,性能提升很多。老板抱怨它太慢了,尤其是和agg框架(使用c++)相比。让我们看看能否从中榨出点果汁。
练习让我们插入1千万条文档,每个文档包含一个从0到1000000的整数。这意味着平均有10个文档会具有相同的值。
> for (var i = 0; i > db.uniques.findone()
{ _id : objectid(51d3c386acd412e22c188dec), dim0 : 570859 }
> db.uniques.ensureindex({dim0: 1})
> db.uniques.stats()
{
ns : test.uniques,
count : 10000000,
size : 360000052,
avgobjsize : 36.0000052,
storagesize : 582864896,
numextents : 18,
nindexes : 2,
lastextentsize : 153874432,
paddingfactor : 1,
systemflags : 1,
userflags : 0,
totalindexsize : 576040080,
indexsizes : {
_id_ : 324456384,
dim0_1 : 251583696
},
ok : 1
}
从这其中,我们想要计算出现的不同值的个数。可以用下列mr任务轻松完成这个工作:
> db.runcommand(
{ mapreduce: uniques,
map: function () { emit(this.dim0, 1); },
reduce: function (key, values) { return array.sum(values); },
out: mrout })
{
result : mrout,
timemillis : 1161960,
counts : {
input : 10000000,
emit : 10000000,
reduce : 1059138,
output : 999961
},
ok : 1
}
正如你在输出内容中看到的,这耗费了大概1200秒(在ec2 m3实例上进行的测试)。有1千万个map,1百万个reduce,输出了999961个文档。结果就像下面这样:
> db.mrout.find()
{ _id : 1, value : 10 }
{ _id : 2, value : 5 }
{ _id : 3, value : 6 }
{ _id : 4, value : 10 }
{ _id : 5, value : 9 }
{ _id : 6, value : 12 }
{ _id : 7, value : 5 }
{ _id : 8, value : 16 }
{ _id : 9, value : 10 }
{ _id : 10, value : 13 }
...
更多详情见请继续阅读下一页的精彩内容:
mongodb 的详细介绍:请点这里
mongodb 的下载地址:请点这里
推荐阅读:
java实现mongodb中自增长字段
centos编译安装mongodb
centos 编译安装 mongodb与mongodb的php扩展
centos 6 使用 yum 安装mongodb及服务器端配置
ubuntu 13.04下安装mongodb2.4.3
如何在mongodb中建立新数据库和集合
mongodb入门必读(概念与实战并重)
《mongodb 权威指南》(mongodb: the definitive guide)英文文字版[pdf]
