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();
}
}
}
КОНЕЦ