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() { |
3 |
if ( this.pages >= 250 ) |
4 |
category = 'Big Books'; |
6 |
category = "Small Books"; |
7 |
emit(category, {name: this.name}); |
所返回的結果:
{"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) { |
3 |
values.forEach(function(doc) { |
8. 在 books 集合中運行 MapReduce 查看源碼 列印 ?
1 |
> var count = db.books.mapReduce(map, reduce, {out: "book_results"}); |
2 |
> db[count.result].find() |
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; |
09 |
public class MongoClient { |
14 |
public static void main(String[] args) { |
19 |
mongo = new Mongo("localhost", 27017); |
20 |
DB db = mongo.getDB("library"); |
22 |
DBCollection books = db.getCollection("books"); |
24 |
BasicDBObject book = new BasicDBObject(); |
25 |
book.put("name", "Understanding JAVA"); |
26 |
book.put("pages", 100); |
29 |
book = new BasicDBObject(); |
30 |
book.put("name", "Understanding JSON"); |
31 |
book.put("pages", 200); |
34 |
book = new BasicDBObject(); |
35 |
book.put("name", "Understanding XML"); |
36 |
book.put("pages", 300); |
39 |
book = new BasicDBObject(); |
40 |
book.put("name", "Understanding Web Services"); |
41 |
book.put("pages", 400); |
44 |
book = new BasicDBObject(); |
45 |
book.put("name", "Understanding Axis2"); |
46 |
book.put("pages", 150); |
49 |
String map = "function() { "+ |
51 |
"if ( this.pages >= 250 ) "+ |
52 |
"category = 'Big Books'; " + |
54 |
"category = 'Small Books'; "+ |
55 |
"emit(category, {name: this.name});}"; |