Статьи

Получение MapReduce Работа на MongoDB

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

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

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

Следуйте инструкциям официальной документации MongoDB, доступной здесь . В моем случае я следовал инструкциям для OS X, и он работал нормально, без проблем.

Я использовал sudo port для установки 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 на другом компьютере с другим портом, используйте следующее.

mongo [ip_address]: [порт]

например: mongo localhost: 4000

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

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

    > use 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. Написание функции Map

Давайте обработаем эту библиотечную коллекцию таким образом, что нам нужно найти количество книг, у которых страницы меньше 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. Запуск 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, можно сделать и с Java. Ниже приводится Java-клиент для него. Вы можете скачать необходимую зависимую банку отсюда .

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

КОНЕЦ