Статьи

MapReduce с MongoDB

MapReduce — это программная среда, представленная Google в 2004 году для поддержки распределенных вычислений на больших наборах данных на кластерах компьютеров. Вы можете прочитать о MapReduce здесь .

MongoDB — это документально-ориентированная система баз данных NoSQL с открытым исходным кодом, написанная на C ++. Вы можете прочитать больше о MongoDB здесь .

1. Установка MangoDB.

Следуйте инструкциям официальной документации MongoDB, доступной здесь . В моем случае я следовал инструкциям для OS X, и он работал нормально, без проблем.
Я использовал sudo port install mongodb для установки MongoDB, и одна проблема, с которой я столкнулся, касалась имеющейся у меня версии xcode. По сути, я установил xcode, когда был в OS X Leopard, и не перешел на xcode до последней версии после перехода на Lion. Как только я обновил xcode, я мог без проблем установить mongodb с MacPort. Еще один совет — иногда ваша установка xcode не работает нормально, когда вы устанавливаете ее напрямую из App Store — вы можете получить xcode из App Store, а затем перейти на панель запуска, найти Install Xcode и установить его оттуда. ,

2. Запуск MongoDB

Запуск MongoDB прост ..
Просто введите mogod в терминале или в командной консоли.
По умолчанию это запустит сервер MongoDB на 27017 и будет использовать каталог / data / db / для хранения данных — да, это каталог, который вы создали на шаге 1.
Если вы хотите изменить эти настройки по умолчанию — вы можете сделать это при запуске сервера.
mongod –port [your_port] –dbpath [your_db_file_path]
Вам нужно убедиться, что your_db_file_path существует и он пуст при первом запуске сервера…

3. Запуск оболочки MongoDB

Мы можем запустить оболочку MongoDB — подключить ее к нашему серверу MongoDB и запускать команды оттуда.
Чтобы запустить оболочку MongoDB для подключения к серверу MongoDB, работающему на той же машине с портами по умолчанию, вам нужно всего лишь ввести mongo в командной строке. Если вы используете сервер MongoDB на другом компьютере с другим портом, используйте следующее.

Монго [ip_address]: [порт]
Например: Монго localhost: 4000

4. Давайте сначала создадим базу данных.

В оболочке MangoDB введите следующее …

1
> use library

Выше предполагается создать базу данных под названием «библиотека».

Теперь, чтобы увидеть, была ли создана ваша база данных, просто наберите следующее — что должно перечислить все базы данных.

1
> show dbs;
Вы заметите, что база данных, которую вы только что создали, там не указана. Причина в том, что MongoDB создает базы данных по требованию. Он будет создан только тогда, когда мы добавим что-то к нему.

5. Вставка данных в MongoDB.

Давайте сначала создадим две книги со следующими командами.

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

Теперь давайте вставим эти две книги в коллекцию под названием books.

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

Приведенные выше два утверждения создадут коллекцию под названием books в библиотеке базы данных. Следующее утверждение перечислит две книги, которые мы только что сохранили.

1
2
3
4
> db.books.find();
 
{ "_id" : ObjectId("4f365b1ed6d9d6de7c7ae4b1"), "name" : "Understanding JAVA", "pages" : 100 }
{ "_id" : ObjectId("4f365b28d6d9d6de7c7ae4b2"), "name" : "Understanding JSON", "pages" : 200 }

Давайте добавим еще несколько записей.

1
2
3
4
5
6
> 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 страниц и больше.

1
2
3
4
5
6
7
8
> var map = function() {
var category;
if ( this.pages >= 250 )
category = 'Big Books';
else
category = "Small Books";
emit(category, {name: this.name});
};

Здесь коллекция, созданная функцией Map, будет иметь коллекцию следующих членов.

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

7. Написание функции уменьшения.

1
2
3
4
5
6
7
> var reduce = function(key, values) {
var sum = 0;
values.forEach(function(doc) {
sum += 1;
});
return {books: sum};
};

8. Запуск MapReduce против коллекции книг.

1
2
3
4
5
> 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, можно сделать и с Java. Ниже приводится Java-клиент для него. Вы можете скачать необходимую зависимую банку отсюда .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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();
  }
 }
}

Ссылка: MapReduce с MongoDB от нашего партнера JCG Прабата Сиривардены в блоге Facile Login .