基于MongoDB分布式存储进行MapReduce并行查询
中介绍了如何基于Mongodb进行关系型数据的分布式存储,有了存储就会牵扯到查询。虽然用普通的方式也可以进行查询,但今天要介绍的是如何使用MONGODB中提供的MapReduce功能进行查询。
有关MongoDb的MapReduce之前我写过一篇文章 Mongodb Mapreduce 初窥,
今天介绍如何基于sharding机制进行mapreduce查询。在MongoDB的官方文档中,这么一句话:
- Sharded Environments
- In sharded environments, data processing of map/reduce operations runs in parallel on all shards.
即: map/reduce操作会并行运行在所有的shards上。
下面我们就用之前这篇文章中白搭建的环境来构造mapreduce查询:
首先要说的是,基于sharding的mapreduce与非sharding的数据在返回结构上有一些区别,我目前注意到的主要是不支持定制式的json格式的返回数据,也就是下面方式可能会出现问题:
- return { count : total };
注意:上面的情况目前出现在了我的测试环境下,如下图:
就需要改成 return count;
下面是测试代码,首先是按帖子id来查询相应数量(基于分组查询实例方式):
- public partial class getfile : System.Web.UI.Page
- {
- public Mongo Mongo { get; set; }
- public IMongoDatabase DB
- {
- get
- {
- return this.Mongo["dnt_mongodb"];
- }
- }
- /// <summary>
- /// Sets up the test environment. You can either override this OnInit to add custom initialization.
- /// </summary>
- public virtual void Init()
- {
- string ConnectionString = "Server=10.0.4.85:27017;ConnectTimeout=30000;ConnectionLifetime=300000;MinimumPoolSize=512;MaximumPoolSize=51200;Pooled=true";
- if (String.IsNullOrEmpty(ConnectionString))
- throw new ArgumentNullException("Connection string not found.");
- this.Mongo = new Mongo(ConnectionString);
- this.Mongo.Connect();
- }
- string mapfunction = "function(){\n" +
- " if(this._id=='548111') { emit(this._id, 1); } \n" +
- "};";
- string reducefunction = "function(key, current ){" +
- " var count = 0;" +
- " for(var i in current) {" +
- " count+=current[i];" +
- " }" +
- " return count ;\n" +
- "};";
- protected void Page_Load(object sender, EventArgs e)
- {
- Init();
- var mrb = DB["posts1"].MapReduce();//attach_gfstream.files
- int groupCount = 0;
- using (var mr = mrb.Map(mapfunction).Reduce(reducefunction))
- {
- foreach (Document doc in mr.Documents)
- {
- groupCount = int.Parse(doc["value"].ToString());
- }
- }
- this.Mongo.Disconnect();
- }
- }
下面是运行时的查询结果,如下:
接着演示一下如何把查询到的帖子信息返回并装入list集合,这里只查询ID为548110和548111两个帖子:
- string mapfunction = "function(){\n" +
- " if(this._id=='548110'|| this._id=='548111') { emit(this, 1); } \n" +
- "};";
- string reducefunction = "function(doc, current ){" +
- " return doc;\n" +
- "};";
- protected void Page_Load(object sender, EventArgs e)
- {
- Init();
- var mrb = DB["posts1"].MapReduce();//attach_gfstream.files
- List<Document> postDoc = new List<Document>();
- using (var mr = mrb.Map(mapfunction).Reduce(reducefunction))
- {
- foreach (Document doc in mr.Documents)
- {
- postDoc.Add((Document)doc["value"]);
- }
- }
- this.Mongo.Disconnect();
- }
下面是运行时的查询结果,如下:
上面的map/reduce方法还有许多写法,如果大家感兴趣可以看一下如下这些链接:
http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
http://www.mongodb.org/display/DOCS/MapReduce
以及之前我写的这篇文章:http://www.cnblogs.com/daizhj/archive/2010/06/10/1755761.html
当然在mongos进行map/reduce运算时,会生成一些临时文件,如下图:
我猜这些临时文件可能会对再次查询系统时的性能有一些提升(但目前未观察到)。
当然对于mongodb的gridfs系统(可使用它搭建分布式文件存储系统,我之前在这篇文章中已介绍过,我也做了测试,但遗憾的是并未成功,它经常会报一些错误,比如:
- Thu Sep 09 12:09:29 Assertion failure _grab client\parallel.cpp 461
看来mapreduce程序链接到mongodb上时,会产生一些问题,但不知道是不是其自身稳定性的原因,还是我的机器环境设置问题(内存或配置的64位系统mongos与32位的client连接问题)。
好了,今天的文章就先到这里了。
基于MongoDB分布式存储进行MapReduce并行查询的更多相关文章
- 基于Solr的HBase多条件查询测试
背景: 某电信项目中采用HBase来存储用户终端明细数据,供前台页面即时查询.HBase无可置疑拥有其优势,但其本身只对rowkey支持毫秒级 的快 速检索,对于多字段的组合查询却无能为力.针对HBa ...
- 【转载】MongoDB中的MapReduce 高级操作介绍
转载自残缺的孤独 1.概述 MongoDB中的MapReduce相当于关系数据库中的group by.使用MapReduce要实现两个函数Map和Reduce函数.Map函数调用emit(key,va ...
- MongoDB中的MapReduce介绍与使用
一.简介 在用MongoDB查询返回的数据量很大的情况下,做一些比较复杂的统计和聚合操作做花费的时间很长的时候,可以用MongoDB中的MapReduce进行实现 MapReduce是个非常灵活和强大 ...
- 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类)
近期工作中有使用到 MongoDb作为日志持久化对象,需要实现对MongoDb的增.删.改.查,但由于MongoDb的版本比较新,是2.4以上版本的,网上已有的一些MongoDb Helper类都是基 ...
- 基于MongoDB.Driver的扩展
由于MongoDB.Driver中的Find方法也支持表达式写法,结合[通用查询设计思想]这篇文章中的查询思想,个人基于MongoDB扩展了一些常用的方法. 首先我们从常用的查询开始,由于MongoD ...
- 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式
适用于app.config与web.config的ConfigUtil读写工具类 之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...
- KingbaseES 并行查询
背景:随着硬件技术的提升,磁盘的IO能力及CPU的运算能力都得到了极大的增强,如何充分利用硬件资源为运算加速,是数据库设计过程中必须考虑的问题.数据库是IO和CPU密集型的软件,大规模的数据访问需要大 ...
- 基于Mongodb的轻量级领域驱动框架(序)
混园子也有些年头了,从各个大牛那儿学了很多东西.技术这东西和中国的料理一样,其中技巧和经验,代代相传(这不是舌尖上的中国广告).转身回头一望,几年来自己也积累了一些东西,五花八门涉猎到各种方向,今日开 ...
- Oracle并行查询出错
1.错误描写叙述 ORA-12801: 并行查询服务器P007中发出错误信号 ORA-01722:无效数字 12801.00000 -"error signaled in parallel ...
随机推荐
- SharedPreference.Editor的apply与commit方法不同之处
定义: void apply boolean commit; 相同:二者都是提交修改的数据 手机里的文件存放在/data/data/<package_name>/shared_prefs ...
- Only the original thread that created a view hierarchy can touch its views
在调试软件的时候出现如下的错误: 01-05 20:53:36.492: E/ZZShip(2043): android.view.ViewRootImpl$CalledFromWrongThread ...
- Nginx配置文件变量大全
$args # 这个变量等于请求行中的参数. $binary_remote_addr # 远程地址的二进制表示 $body_bytes_sent # 已发送的消息体字节数 $content_lengt ...
- easy ui datagrid在没有数据时显示相关提示内容
$(function () { $('#dg').datagrid({ fitColumns: true, url: 'product.json', pagination: true, pageSiz ...
- Object c中的alloc和init问题
从开始学的NSString *name=[[NSString alloc] init] 起,老师教这句话是分配内存空间,一直在用,从来没考虑过它的内部是怎么实现的.今天无意中看到了这一句代码 NSSt ...
- DirectX考试判卷心得
今天帮老师判<三维图形程序设计>的试卷,这门课开卷考,用的教材是段菲翻译的DX9的龙书.判卷过程中发现有两道题虽然不难,但是错的比较多: 1.Direct3D中深度缓冲区中值的范围? A. ...
- Eclipse升级到4.4.2后界面主题更改
在win8.1电脑上一直很喜欢eclipse luna sr1a(4.4.1)版本的界面好像是软件自动设置的. 这几天更新到eclipse luna sr2(4.4.2)版本后发现界面大变,怎么也找不 ...
- 1030: [JSOI2007]文本生成器 - BZOJ
Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- (转)基于即时通信和LBS技术的位置感知服务(二):XMPP协议总结以及开源解决方案
在<基于即时通信和LBS技术的位置感知服务(一):提出问题及解决方案>一文中,提到尝试使用XMPP协议来实现即时通信.本文将对XMPP协议框架以及相关的C/S架构进行介绍,协议的底层实现不 ...
- C++函数中那些不可以被声明为虚函数的函数
转自C++函数中那些不可以被声明为虚函数的函数 常见的不不能声明为虚函数的有:普通函数(非成员函数):静态成员函数:内联成员函数:构造函数:友元函数. 1.为什么C++不支持普通函数为虚函数? 普通函 ...