Можно ли читать данные MongoDB, обрабатывать их с помощью Hadoop и выводить их в RDBS (MySQL)? - PullRequest
7 голосов
/ 01 апреля 2012

Сводка:

Возможно ли:

  1. Импортировать данные в Hadoop с помощью «MongoDB Connector for Hadoop».
  2. Обработать его с помощьюHadoop MapReduce.
  3. Экспортируйте его с помощью Sqoop за одну транзакцию.

Я создаю веб-приложение с MongoDB.Хотя MongoDB хорошо работает для большей части работы, в некоторых частях мне нужны более сильные транзакционные гарантии, для которых я использую базу данных MySQL.

Моя проблема заключается в том, что я хочу прочитать большую коллекцию MongoDB для анализа данных, норазмер коллекции означает, что аналитическая работа займет слишком много времени для обработки.К сожалению, встроенная инфраструктура MongoDB map-Reduction не будет хорошо работать для этой работы, поэтому я бы предпочел провести анализ с помощью Apache Hadoop .

Я понимаю, что можно прочитатьданные из MongoDB в Hadoop с помощью «MongoDB Connector for Hadoop» , который считывает данные из MongoDB, обрабатывает их с помощью MapReduce в Hadoop и, наконец, выводит результаты обратно в базу данных MongoDB.

Проблема в том, что я хочу, чтобы выходные данные MapReduce помещались в базу данных MySQL, а не в MongoDB, потому что результаты должны быть объединены с другими таблицами MySQL.

Для этого я знаю, что Sqoop может экспортировать результат Hadoop MapReduce в MySQL.

В конечном счете, я хочу слишком прочитать данные MongoDB, затем обработать их с помощью Hadoop и, наконец, вывести результат в MySQL.база данных.

Возможно ли это?Какие инструменты доступны для этого?

Ответы [ 3 ]

10 голосов
/ 01 апреля 2012

TL; DR: Установить форматер вывода, который записывает в RDBS в задании Hadoop:

 job.setOutputFormatClass( DBOutputFormat.class );

Несколько замечаний:

  1. Экспорт данных из MongoDB в Hadoop с использованием Sqoop невозможен. Это связано с тем, что Sqoop использует JDBC , который предоставляет API уровня вызовов для базы данных на основе SQL , но MongoDB не является базой данных на основе SQL . Вы можете посмотреть на «MongoDB Connector for Hadoop» , чтобы выполнить эту работу. Разъем доступен на GitHub . (Изменить: как вы указали в своем обновлении.)

  2. Экспорт Sqoop по умолчанию не выполняется в одной транзакции. Вместо этого, согласно Sqoop docs :

    Поскольку Sqoop разбивает процесс экспорта на несколько транзакций, возможно, что неудачное задание экспорта может привести к частичной фиксации данных в базе данных. Это может также привести к сбою последующих заданий из-за конфликтов вставки в некоторых случаях или к дублированию данных в других. Вы можете решить эту проблему, указав промежуточную таблицу с помощью опции --staging-table, которая действует как вспомогательная таблица, используемая для подготовки экспортированных данных. Постановочные данные наконец перемещаются в таблицу назначения за одну транзакцию.

  3. «Соединитель MongoDB для Hadoop», похоже, не стимулирует описанный вами рабочий процесс. Согласно документам:

    Это подключение имеет форму, позволяющую как считывать данные MongoDB в Hadoop (для использования в заданиях MapReduce, так и в других компонентах экосистемы Hadoop), так и записывать результаты заданий Hadoop в MongoDB.

  4. Действительно, насколько я понимаю из «MongoDB Connector для Hadoop»: примеры , можно было бы указать org.apache.hadoop.mapred.lib.db.DBOutputFormat в вашем Hadoop MapReduce задание записать вывод в базу данных MySQL. Следуя примеру из хранилища соединителей:

    job.setMapperClass( TokenizerMapper.class );
    job.setCombinerClass( IntSumReducer.class );
    job.setReducerClass( IntSumReducer.class );
    job.setOutputKeyClass( Text.class );
    job.setOutputValueClass( IntWritable.class );
    job.setInputFormatClass( MongoInputFormat.class );
    /* Instead of:
     * job.setOutputFormatClass( MongoOutputFormat.class );
     * we use an OutputFormatClass that writes the job results 
     * to a MySQL database. Beware that the following OutputFormat 
     * will only write the *key* to the database, but the principle
     * remains the same for all output formatters
     */
    job.setOutputFormatClass( DBOutputFormat.class );
    
0 голосов
/ 03 июня 2014

Используйте соединитель MongoHadoop для чтения данных из MongoDB и обработки их с помощью Hadoop.

Ссылка: https://github.com/mongodb/mongo-hadoop/blob/master/hive/README.md

Используя этот соединитель, вы можете использовать Pig и Hive для чтения данных из Mongo db иобработайте его, используя Hadoop.

Пример таблицы Mongo Hive:

  CREATE EXTERNAL TABLE TestMongoHiveTable
    ( 
    id STRING,
    Name STRING
    )
    STORED BY 'com.mongodb.hadoop.hive.MongoStorageHandler'
    WITH SERDEPROPERTIES('mongo.columns.mapping'='{"id":"_id","Name":"Name"}')
    LOCATION '/tmp/test/TestMongoHiveTable/' 
    TBLPROPERTIES('mongo.uri'='mongodb://{MONGO_DB_IP}/userDetails.json');

После экспорта в таблицу кустов вы можете использовать Sqoop или Pig для экспорта данных в mysql.

Вот поток.

Mongo DB -> Обработка данных с помощью коннектора Mongo DB hadoop (Pig) -> Сохранение его в таблице кустов / HDFS -> Экспорт данных в mysql с использованием sqoop.

0 голосов
/ 12 августа 2013

Я бы порекомендовал вам взглянуть на Apache Pig (который работает поверх карты Hadoop).Он выведет на MySql (не нужно использовать Scoop).Я использовал это, чтобы сделать то, что вы описываете.Можно сделать "upsert" с Pig и MySql.Вы можете использовать команду PIG STORE с DBStorage в piggyBank и MySql INSERT DUPLICATE KEY UPDATE (http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html).

...