<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文 &#187; daizhj</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/daizhj/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Mon, 28 May 2012 13:40:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>基于 MongoDB 分布式存储进行 MapReduce 并行查询</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/11/11/mongodb-mapreduce/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/11/11/mongodb-mapreduce/#comments</comments>
		<pubDate>Thu, 11 Nov 2010 11:54:12 +0000</pubDate>
		<dc:creator>daizhj</dc:creator>
				<category><![CDATA[其他]]></category>
		<category><![CDATA[博客征文专栏]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/11/11/mongodb-mapreduce/</guid>
		<description><![CDATA[ 之前的文章中介绍了如何基于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 { [...]]]></description>
			<content:encoded><![CDATA[<p> 之前的文章中介绍了如何基于Mongodb进行关系型数据的分布式存储，有了存储就会牵扯到查询。虽然用普通的方式也可以进行查询，但今天要介绍的是如何使用MONGODB中提供的MapReduce功能进行查询。<br />
有关MongoDb的MapReduce之前我写过一篇文章 Mongodb Mapreduce 初窥，</p>
<p>今天介绍如何基于sharding机制进行mapreduce查询。在MongoDB的官方文档中，这么一句话：</p>
<p>Sharded Environments<br />
In sharded environments, data processing of map/reduce operations runs in parallel on all shards.</p>
<p>即: map/reduce操作会并行运行在所有的shards上。<br />
下面我们就用之前这篇文章中白搭建的环境来构造mapreduce查询：</p>
<p>首先要说的是，基于sharding的mapreduce与非sharding的数据在返回结构上有一些区别，我目前注意到的主要是不支持定制式的json格式的返回数据，也就是下面方式可能会出现问题：</p>
<p>return { count : total };</p>
<p>注意：上面的情况目前出现在了我的测试环境下，如下图：</p>
<p><img src="http://daizhj.cnblogs.com/images/cnblogs_com/daizhj/mongodb_sharding_mapreduce4.gif" alt="http://daizhj.cnblogs.com/images/cnblogs_com/daizhj/mongodb_sharding_mapreduce4.gif" width="572" height="321" /></p>
<p>就需要改成 return count;</p>
<p>下面是测试代码，首先是按帖子id来查询相应数量（基于分组查询实例方式）：</p>
<p>public partial class getfile : System.Web.UI.Page<br />
{</p>
<p>public Mongo Mongo { get; set; }</p>
<p>public IMongoDatabase DB<br />
{<br />
get<br />
{<br />
return this.Mongo["dnt_mongodb"];<br />
}<br />
}</p>
<p>///<br />
/// Sets up the test environment. You can either override this OnInit to add custom initialization.<br />
///<br />
public virtual void Init()<br />
{<br />
string ConnectionString = "Server=10.0.4.85:27017;ConnectTimeout=30000;ConnectionLifetime=300000;MinimumPoolSize=512;MaximumPoolSize=51200;Pooled=true";<br />
if (String.IsNullOrEmpty(ConnectionString))<br />
throw new ArgumentNullException("Connection string not found.");<br />
this.Mongo = new Mongo(ConnectionString);<br />
this.Mongo.Connect();<br />
}<br />
string mapfunction = "function(){\n" +<br />
" if(this._id=='548111') { emit(this._id, 1); } \n" +<br />
"};";</p>
<p>string reducefunction = "function(key, current ){" +<br />
" var count = 0;" +<br />
" for(var i in current) {" +<br />
" count+=current[i];" +<br />
" }" +<br />
" return count ;\n" +<br />
"};";</p>
<p>protected void Page_Load(object sender, EventArgs e)<br />
{<br />
Init();</p>
<p>var mrb = DB["posts1"].MapReduce();//attach_gfstream.files<br />
int groupCount = 0;<br />
using (var mr = mrb.Map(mapfunction).Reduce(reducefunction))<br />
{<br />
foreach (Document doc in mr.Documents)<br />
{<br />
groupCount = int.Parse(doc["value"].ToString());<br />
}<br />
}<br />
this.Mongo.Disconnect();<br />
}<br />
}</p>
<p>下面是运行时的查询结果，如下：</p>
<p><img src="http://daizhj.cnblogs.com/images/cnblogs_com/daizhj/mongodb_sharding_mapreduce1.gif" alt="http://daizhj.cnblogs.com/images/cnblogs_com/daizhj/mongodb_sharding_mapreduce1.gif" /></p>
<p>接着演示一下如何把查询到的帖子信息返回并装入list集合，这里只查询ID为548110和548111两个帖子：</p>
<p>string mapfunction = "function(){\n" +<br />
" if(this._id=='548110'|| this._id=='548111') { emit(this, 1); } \n" +<br />
"};";</p>
<p>string reducefunction = "function(doc, current ){" +<br />
" return doc;\n" +<br />
"};";</p>
<p>protected void Page_Load(object sender, EventArgs e)<br />
{<br />
Init();</p>
<p>var mrb = DB["posts1"].MapReduce();//attach_gfstream.files<br />
List postDoc = new List();<br />
using (var mr = mrb.Map(mapfunction).Reduce(reducefunction))<br />
{<br />
foreach (Document doc in mr.Documents)<br />
{<br />
postDoc.Add((Document)doc["value"]);<br />
}<br />
}<br />
this.Mongo.Disconnect();<br />
}</p>
<p>下面是运行时的查询结果，如下：</p>
<p><img src="http://daizhj.cnblogs.com/images/cnblogs_com/daizhj/mongodb_sharding_mapreduce3.gif" alt="http://daizhj.cnblogs.com/images/cnblogs_com/daizhj/mongodb_sharding_mapreduce3.gif" width="718" height="258" /></p>
<p>上面的map/reduce方法还有许多写法，如果大家感兴趣可以看一下如下这些链接：</p>
<p>http://cookbook.mongodb.org/patterns/unique_items_map_reduce/</p>
<p>http://www.mongodb.org/display/DOCS/MapReduce</p>
<p>以及之前我写的这篇文章：http://www.cnblogs.com/daizhj/archive/2010/06/10/1755761.html</p>
<p>当然在mongos进行map/reduce运算时，会生成一些临时文件，如下图：<br />
<img src="http://daizhj.cnblogs.com/images/cnblogs_com/daizhj/mongodb_sharding_mapreduce2.gif" alt="http://daizhj.cnblogs.com/images/cnblogs_com/daizhj/mongodb_sharding_mapreduce2.gif" width="617" height="405" /></p>
<p>我猜这些临时文件可能会对再次查询系统时的性能有一些提升（但目前未观察到）。</p>
<p>当然对于mongodb的gridfs系统（可使用它搭建分布式文件存储系统，我之前在这篇文章中已介绍过，我也做了测试，但遗憾的是并未成功，它经常会报一些错误，比如：</p>
<p>Thu Sep 09 12:09:29 Assertion failure _grab client\parallel.cpp 461</p>
<p>看来mapreduce程序链接到mongodb上时，会产生一些问题，但不知道是不是其自身稳定性的原因，还是我的机器环境设置问题（内存或配置的64位系统mongos与32位的client连接问题）。</p>
<p>好了，今天的文章就先到这里了。</p>
<p>原文链接:http://www.cnblogs.com/daizhj/archive/2010/09/09/1822264.html</p>
<p>BLOG: http://daizhj.cnblogs.com/</p>
<p>作者:daizhj,代震军</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/11/11/mongodb-mapreduce/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

