使用MongoDB的MapReduce

MapReduce是Google在2004年推出的一种软件框架,用于支持对计算机集群中的大数据集进行分布式计算。 您可以从此处阅读有关MapReduce的信息

MongoDB是用C ++编写的面向开源文档的NoSQL数据库系统。 您可以从此处阅读有关MongoDB的更多信息。

1.安装MangoDB。

请遵循此处提供的MongoDB官方文档中的说明。 就我而言,我遵循了OS X的说明,并且工作正常,没有任何问题。
我使用sudo port install mongodb来安装MongoDB,我遇到的一个问题是关于我拥有的xcode版本。 基本上,我在OS X Leopard时安装了xcode,并且在移至Lion之后没有将xcode更新为最新版本。 一旦更新了xcode,就可以在MacPort上安装mongodb了。 另一个提示-有时直接从App Store安装xcode时无法正常工作-可以做的是,从App Store获取xcode,然后转到启动板,找到Install Xcode并从那里安装。

2.运行MongoDB

启动MongoDB很简单。
只需在终端或命令控制台中输入mogod即可
默认情况下,它将在27017上启动MongoDB服务器,并将使用/ data / db /目录存储数据–是的,即您在步骤– 1中创建的目录。
如果要更改这些默认设置,可以在启动服务器时进行更改。
mongod –port [your_port] –dbpath [your_db_file_path]
首次启动服务器时,需要确保your_db_file_path存在并且为空…

3.启动MongoDB shell

我们可以启动MongoDB shell –将其连接到我们的MongoDB服务器并从那里运行命令。
要启动MongoDB Shell以使用默认端口连接到在同一台计算机上运行的MongoDB服务器,您只需在命令行中键入mongo 。 如果您在具有不同端口的另一台机器上运行MongoDB服务器,请使用以下命令。

mongo [ip_address]:[端口]
例如:mongo localhost:4000

4.首先创建一个数据库。

在MangoDB Shell中输入以下内容…

> use library

上面应该创建一个名为“ library”的数据库。

现在查看是否已创建数据库,只需键入以下内容-应该列出所有数据库。

> show dbs;
您会注意到,您刚才创建的数据库未在此处列出。 原因是,MongoDB按需创建数据库。 只有当我们添加一些东西时,它才会被创建。

5.将数据插入MongoDB。

首先,使用以下命令创建两本书。

> book1 = {name : "Understanding JAVA", pages : 100}
> book2 = {name : "Understanding JSON", pages : 200}

现在,让我们将这两本书插入到名为books的集合中。

> db.books.save(book1)
> db.books.save(book2)

上面的两个语句将在数据库库下创建一个称为books的集合。 以下语句将列出我们刚刚保存的两本书。

> db.books.find();

{ "_id" : ObjectId("4f365b1ed6d9d6de7c7ae4b1"), "name" : "Understanding JAVA", "pages" : 100 }
{ "_id" : ObjectId("4f365b28d6d9d6de7c7ae4b2"), "name" : "Understanding JSON", "pages" : 200 }

让我们再添加一些记录。

> book = {name : "Understanding XML", pages : 300}
> db.books.save(book)
> book = {name : "Understanding Web Services", pages : 400}
> db.books.save(book)
> book = {name : "Understanding Axis2", pages : 150}
> db.books.save(book)

6.编写地图功能

让我们以某种方式处理该图书馆藏书,我们需要找到页数少于250页且大于250页的书籍数量。

> var map = function() {
var category;
if ( this.pages >= 250 ) 
category = 'Big Books';
else 
category = "Small Books";
emit(category, {name: this.name});
};

在此,由Map函数生成的集合将具有以下成员的集合。

{"Big Books",[{name: "Understanding XML"}, {name : "Understanding Web Services"}]);
{"Small Books",[{name: "Understanding JAVA"}, {name : "Understanding JSON"},{name: "Understanding Axis2"}]);

7.编写减少功能。

> var reduce = function(key, values) {
var sum = 0;
values.forEach(function(doc) {
sum += 1;
});
return {books: sum};
};

8.针对books集合运行MapReduce。

> var count  = db.books.mapReduce(map, reduce, {out: "book_results"});
> db[count.result].find()

{ "_id" : "Big Books", "value" : { "books" : 2 } }
{ "_id" : "Small Books", "value" : { "books" : 3 } }

上面说,我们有2本大书和3本小书。

上面使用MongoDB Shell完成的所有操作,也可以使用Java完成。 以下是它的Java客户端。 您可以从此处下载所需的从属jar。

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MapReduceCommand;
import com.mongodb.MapReduceOutput;
import com.mongodb.Mongo;

public class MongoClient {

 /**
  * @param args
  */
 public static void main(String[] args) {

  Mongo mongo;
  
  try {
   mongo = new Mongo("localhost", 27017);
   DB db = mongo.getDB("library");

   DBCollection books = db.getCollection("books");

   BasicDBObject book = new BasicDBObject();
   book.put("name", "Understanding JAVA");
   book.put("pages", 100);
   books.insert(book);
   
   book = new BasicDBObject();  
   book.put("name", "Understanding JSON");
   book.put("pages", 200);
   books.insert(book);
   
   book = new BasicDBObject();
   book.put("name", "Understanding XML");
   book.put("pages", 300);
   books.insert(book);
   
   book = new BasicDBObject();
   book.put("name", "Understanding Web Services");
   book.put("pages", 400);
   books.insert(book);
 
   book = new BasicDBObject();
   book.put("name", "Understanding Axis2");
   book.put("pages", 150);
   books.insert(book);
   
   String map = "function() { "+ 
             "var category; " +  
             "if ( this.pages >= 250 ) "+  
             "category = 'Big Books'; " +
             "else " +
             "category = 'Small Books'; "+  
             "emit(category, {name: this.name});}";
   
   String reduce = "function(key, values) { " +
                            "var sum = 0; " +
                            "values.forEach(function(doc) { " +
                            "sum += 1; "+
                            "}); " +
                            "return {books: sum};} ";
   
   MapReduceCommand cmd = new MapReduceCommand(books, map, reduce,
     null, MapReduceCommand.OutputType.INLINE, null);

   MapReduceOutput out = books.mapReduce(cmd);

   for (DBObject o : out.results()) {
    System.out.println(o.toString());
   }
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}

参考: Facile Login博客上的JCG合作伙伴 Prabath Siriwardena的MongoDBMapReduce


翻译自: https://www.javacodegeeks.com/2012/06/mapreduce-with-mongodb.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值