用MongoDB實現MapReduce

來源:互聯網
上載者:User

MapReduce 是 Google 在 2004 年發布的一個軟體架構,用於支援大規模資料的分散式運算,詳情請看這裡。

MongoDB 是一個開源的面向文檔的 NoSQL 資料庫系統,使用 C++ 編寫,詳情請看這裡。

1. 安裝 MangoDB

首先請按照官方這個文檔安裝 MongoDB 資料庫,在本文中,我們是在 Mac OS X 下安裝並測試無誤。

我使用 sudo port install mongodb 命令來安裝 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]

例如 : mongo localhost:4000

4. 建立資料庫

接下來在互動環境中執行下面命令來建立資料庫:

use library

上述命令建立了一個名為 library 的資料庫。

然後我們可以通過下面的命令來查看剛建立的資料庫,下面命令列出系統中所有的資料庫:

show dbs;

你會注意到,你剛建立的資料庫並沒有列出來,這是因為 MongoDB 只有在需要的時候才會建立資料庫,因此你需要往資料庫裡添加點資料。

5. 往資料庫中插入資料

首先我們通過以下命令建立兩本書:

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

然後將這兩本書保持到名為 books 的集合中:

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

上述命令將在 library 資料庫中建立一個名為 books 的集合(也就是SQL資料庫中的表),下面命令將列出我們剛添加的兩本書:

> 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. 編寫 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 };

所返回的結果:

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

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 };

8. 在 books 集合中運行 MapReduce 查看源碼 列印 ?

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 也一樣,但是你需要下載一些必須的jar包。

下面是 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   * @param args
13   */
14  public static void main(String[] args) {
15   
16   Mongo mongo;
17     
18   try {
19    mongo = new Mongo("localhost", 27017);
20    DB db = mongo.getDB("library");
21   
22    DBCollection books = db.getCollection("books");
23   
24    BasicDBObject book = new BasicDBObject();
25    book.put("name", "Understanding JAVA");
26    book.put("pages", 100);
27    books.insert(book);
28      
29    book = new BasicDBObject();  
30    book.put("name", "Understanding JSON");
31    book.put("pages", 200);
32    books.insert(book);
33      
34    book = new BasicDBObject();
35    book.put("name", "Understanding XML");
36    book.put("pages", 300);
37    books.insert(book);
38      
39    book = new BasicDBObject();
40    book.put("name", "Understanding Web Services");
41    book.put("pages", 400);
42    books.insert(book);
43    
44    book = new BasicDBObject();
45    book.put("name", "Understanding Axis2");
46    book.put("pages", 150);
47    books.insert(book);
48      
49    String map = "function() { "+ 
50              "var category; " +  
51              "if ( this.pages >= 250 ) "+  
52              "category = 'Big Books'; " +
53              "else " +
54              "category = 'Small Books'; "+  
55              "emit(category, {name: this.name});}";
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.