用MongoDB实现MapReduce
2012-04-23 09:05
253 查看
MapReduce是Google在2004年发布的一个软件框架,用于支持大规模数据的分布式计算,详情请看这里。
MongoDB是一个开源的面向文档的NoSQL数据库系统,使用C++编写,详情请看这里。
1.安装MangoDB
首先请按照官方这个文档安装
MongoDB数据库,在本文中,我们是在MacOSX下安装并测试无误。
我使用sudoportinstallmongodb命令来安装MongoDB,唯一碰到的一个问题是xcode的版本问题,升级到xcode的最新版本就好了。
2.运行MongoDB
启动MongoDB是很简单的,只需要在终端窗口中执行mogod即可。
默认MongoDB是运行在27017端口上,使用/data/db作为默认目录来存放数据(我们已经在第一步就创建了这个目录)
如果你修改这些默认的配置,你可以通过命令行参数来进行修改:
mongod
--port[your_port]--dbpath[your_db_file_path]
你需要确认的是数据目录必须已经存在并且在mongodb首次启动时该目录下没有其他文件。
3.启动MongoDB交互环境
我们可以启动MongoDB交互环境来连接到MongoDB服务器,并在命令行中直接运行MongoDB命令。
在同一台机器上,你只需要简单的执行mongo就可以进入交互环境,如果想要连接不同机器上的MongoDB服务器,你可以使用下面的参数来指定目标服务器的IP地址和端口:
mongo[ip_address]:[port]
例如:mongolocalhost:4000
4.创建数据库
接下来在交互环境中执行下面命令来创建数据库:
uselibrary
上述命令创建了一个名为library的数据库。
然后我们可以通过下面的命令来查看刚创建的数据库,下面命令列出系统中所有的数据库:
showdbs;
你会注意到,你刚创建的数据库并没有列出来,这是因为MongoDB只有在需要的时候才会创建数据库,因此你需要往数据库里添加点数据。
5.往数据库中插入数据
首先我们通过以下命令创建两本书:
>book1={name:"UnderstandingJ***A",pages:100}
>book2={name:"UnderstandingJSON",pages:200}
然后将这两本书保持到名为books的集合中:
>db.books.save(book1)
>db.books.save(book2)
上述命令将在library数据库中创建一个名为books的集合(也就是SQL数据库中的表),下面命令将列出我们刚添加的两本书:
>db.books.find();
{"_id":ObjectId("4f365b1ed6d9d6de7c7ae4b1"),"name":"UnderstandingJ***A","pages":100}
{"_id":ObjectId("4f365b28d6d9d6de7c7ae4b2"),"name":"UnderstandingJSON","pages":200}
添加更多的记录:
>book={name:"UnderstandingXML",pages:300}
>db.books.save(book)
>book={name:"UnderstandingWebServices",pages:400}
>db.books.save(book)
>book={name:"UnderstandingAxis2",pages:150}
>db.books.save(book)
6.编写Map函数
接下来我们编写一个搜索功能,用来查找超过250页的图书:
所返回的结果:
{"BigBooks",[{name:"UnderstandingXML"},{name:"UnderstandingWebServices"}]);
{"SmallBooks",[{name:"UnderstandingJ***A"},{name:"UnderstandingJSON"},{name:"UnderstandingAxis2"}]);
7.编写Reduce函数
8.在books集合中运行MapReduce
上述结果表明我们有两本大书和三本小书。
利用MongoDB交互环境可以做任何事情,用Java也一样,但是你需要下载一些必须的jar包。
下面是Java的源码:
MongoDB是一个开源的面向文档的NoSQL数据库系统,使用C++编写,详情请看
1.安装MangoDB
首先请按照官方这个
MongoDB数据库,在本文中,我们是在MacOSX下安装并测试无误。
我使用sudoportinstallmongodb命令来安装MongoDB,唯一碰到的一个问题是xcode的版本问题,升级到xcode的最新版本就好了。
2.运行MongoDB
启动MongoDB是很简单的,只需要在终端窗口中执行mogod即可。
默认MongoDB是运行在27017端口上,使用/data/db作为默认目录来存放数据(我们已经在第一步就创建了这个目录)
如果你修改这些默认的配置,你可以通过命令行参数来进行修改:
mongod
--port[your_port]--dbpath[your_db_file_path]
你需要确认的是数据目录必须已经存在并且在mongodb首次启动时该目录下没有其他文件。
3.启动MongoDB交互环境
我们可以启动MongoDB交互环境来连接到MongoDB服务器,并在命令行中直接运行MongoDB命令。
在同一台机器上,你只需要简单的执行mongo就可以进入交互环境,如果想要连接不同机器上的MongoDB服务器,你可以使用下面的参数来指定目标服务器的IP地址和端口:
mongo[ip_address]:[port]
例如:mongolocalhost:4000
4.创建数据库
接下来在交互环境中执行下面命令来创建数据库:
uselibrary
上述命令创建了一个名为library的数据库。
然后我们可以通过下面的命令来查看刚创建的数据库,下面命令列出系统中所有的数据库:
showdbs;
你会注意到,你刚创建的数据库并没有列出来,这是因为MongoDB只有在需要的时候才会创建数据库,因此你需要往数据库里添加点数据。
5.往数据库中插入数据
首先我们通过以下命令创建两本书:
>book1={name:"UnderstandingJ***A",pages:100}
>book2={name:"UnderstandingJSON",pages:200}
然后将这两本书保持到名为books的集合中:
>db.books.save(book1)
>db.books.save(book2)
上述命令将在library数据库中创建一个名为books的集合(也就是SQL数据库中的表),下面命令将列出我们刚添加的两本书:
>db.books.find();
{"_id":ObjectId("4f365b1ed6d9d6de7c7ae4b1"),"name":"UnderstandingJ***A","pages":100}
{"_id":ObjectId("4f365b28d6d9d6de7c7ae4b2"),"name":"UnderstandingJSON","pages":200}
添加更多的记录:
>book={name:"UnderstandingXML",pages:300}
>db.books.save(book)
>book={name:"UnderstandingWebServices",pages:400}
>db.books.save(book)
>book={name:"UnderstandingAxis2",pages:150}
>db.books.save(book)
6.编写Map函数
接下来我们编写一个搜索功能,用来查找超过250页的图书:
1 | > var map = function () { |
2 | var category; |
3 | if ( this .pages >=250) |
4 | category = 'Big Books' ; |
5 | else |
6 | category = "Small Books" ; |
7 | emit(category, {name: this .name}); |
8 | }; |
{"BigBooks",[{name:"UnderstandingXML"},{name:"UnderstandingWebServices"}]);
{"SmallBooks",[{name:"UnderstandingJ***A"},{name:"UnderstandingJSON"},{name:"UnderstandingAxis2"}]);
7.编写Reduce函数
1 | > var reduce = function (key, values){ |
2 | var sum =0; |
3 | values.forEach( function (doc) { |
4 | sum +=1; |
5 | }); |
6 | return {books: sum}; |
7 | }; |
1 | > var count =db.books.mapReduce(map,reduce,{out: "book_results" }); |
2 | > db[count.result].find() |
3 |
4 | { "_id" : "Big Books" , "value" : "books" : 2}} |
5 | { "_id" : "Small Books" , "value" : "books" : 3}} |
利用MongoDB交互环境可以做任何事情,用Java也一样,但是你需要下载一些必须的
下面是Java的源码:
01 | import com.mongodb.BasicDBObject; |
02 | import com.mongodb.DB; |
03 | import com.mongodb.DBCollection; |
04 | import com.mongodb.DBObject; |
05 | import com.mongodb.MapReduceCommand; |
06 | import com.mongodb.MapReduceOutput; |
07 | import com.mongodb.Mongo; |
08 |
09 | public class MongoClient { |
10 |
11 | /** |
12 | * |
13 | */ |
14 | public static void main(String[] |
15 |
16 | Mongo |
17 |
18 | try { |
19 | mongo new Mongo( "localhost" , 27017 ); |
20 | DB "library" ); |
21 |
22 | DBCollection "books" ); |
23 |
24 | BasicDBObject new BasicDBObject(); |
25 | book.put( "name" , "Understanding ); |
26 | book.put( "pages" , 100 ); |
27 | books.insert(book); |
28 |
29 | book new BasicDBObject(); |
30 | book.put( "name" , "Understanding ); |
31 | book.put( "pages" , 200 ); |
32 | books.insert(book); |
33 |
34 | book new BasicDBObject(); |
35 | book.put( "name" , "Understanding ); |
36 | book.put( "pages" , 300 ); |
37 | books.insert(book); |
38 |
39 | book new BasicDBObject(); |
40 | book.put( "name" , "Understanding ); |
41 | book.put( "pages" , 400 ); |
42 | books.insert(book); |
43 |
44 | book new BasicDBObject(); |
45 | book.put( "name" , "Understanding ); |
46 | book.put( "pages" , 150 ); |
47 | books.insert(book); |
48 |
49 | String "function() {" + |
50 | "var + |
51 | "if + |
52 | "category ='BigBooks';" + |
53 | "else + |
54 | "category ='SmallBooks';" + |
55 | "emit(category, {name:this.name});}" ; |
56 |
57 | String "function(key, values){" + |
58 | "var + |
59 | "values.forEach(function(doc) {" + |
60 | "sum +=1;" + |
61 | "}); + |
62 | "return ; |
63 |
64 | MapReduceCommand new MapReduceCommand(books, |
65 | null , null ); |
66 |
67 | MapReduceOutput |
68 |
69 | for (DBObject |
70 | System.out.println(o.toString()); |
71 | } |
72 | } catch (Exception |
73 | // |
74 | e.printStackTrace(); |
75 | } |
76 | } |
77 | } |
相关文章推荐
- 用MongoDB实现MapReduce(翻译)
- MapReduce初探之一~~基于Mongodb实现标签统计
- MongoDB中通过MapReduce实现合计Sum功能及返回格式不一致问题分析
- 在MongoDB中实现聚合函数(mapreduce)
- mongoDB使用mapreduce实现简单的统计功能
- Mongodb中MapReduce实现数据聚合方法详解
- MongoDB上MapReduce的实现以及项目实例探索
- mapreduce-在MongoDB中,用MapReduce实现两个有引用关系的集合的统计
- 用MongoDB实现MapReduce
- 用MongoDB实现MapReduce
- Mongodb中MapReduce实现数据聚合方法详解
- MapReduce小文件处理之CombineFileInputFormat实现
- Yii MongoDbSuite自增ID实现
- 如何使用容器实现生产级别的MongoDB sharding集群的一键交付
- Hadoop MapReduce进阶 使用DataJoin包实现Join
- python实现mapreduce(1)——模拟MR过程
- 图解 MongoDB 地理位置索引的实现原理
- MongoDB两阶段提交实现事务
- java操作mongodb实现CURD功能实例
- 使用MapReduce实现简单的倒排索引