2012-04-01 7 views
7

Podsumowanie:

Czy jest możliwe:Czy można odczytać dane MongoDB, przetworzyć je za pomocą Hadoop i wyprowadzić do RDBS (MySQL)?

  1. dane zaimportować do Hadoop z «MongoDB Connector for Hadoop».
  2. Przetwarzaj za pomocą Hadoop MapReduce.
  3. Wyeksportuj go za pomocą Sqoop w ramach jednej transakcji.

Jestem budowania aplikacji WWW z MongoDB. Podczas gdy MongoDB działa dobrze dla większości prac, w niektórych częściach potrzebuję silniejszych gwarancji transakcyjnych, dla których używam bazy danych MySQL.

Moim problemem jest to, że chcę przeczytać dużą kolekcję MongoDB do analizy danych, ale rozmiar kolekcji oznacza, że ​​przetwarzanie zadania analitycznego zajmie zbyt dużo czasu. Niestety, wbudowana w MongoDB struktura redukcji map nie będzie działać dobrze w tym zadaniu, więc wolałbym przeprowadzić analizę z Apache Hadoop.

Rozumiem, że możliwe jest odczytywanie danych z MongoDB do Hadoop za pomocą «MongoDB Connector for Hadoop», który odczytuje dane z MongoDB, przetwarza je za pomocą MapReduce w Hadoop, i ostatecznie wysyła wyniki z powrotem do bazy danych MongoDB.

Problem polega na tym, że chcę, aby dane wyjściowe MapReduce trafiały do ​​bazy danych MySQL, a nie do MongoDB, ponieważ wyniki muszą zostać połączone z innymi tabelami MySQL.

W tym celu wiem, że Sqoop może eksportować wynik Hadoop MapReduce do MySQL.

Ostatecznie, chcę zbyt przeczytać dane MongoDB, a następnie przetworzyć je za pomocą Hadoop i ostatecznie wyprowadzić wynik do bazy danych MySQL.

Czy to możliwe? Jakie narzędzia są dostępne, aby to zrobić?

+0

Twoje pytanie może być znacznie wyraźniejsze. Wcale nie jestem pewien, co próbujesz zrobić. Zmienię twoje pytanie, aby odzwierciedlić to, co myślę, że próbujesz powiedzieć, ale twoje wyjaśnienie też byłoby pomocne. – brice

+0

Uaktualniam moje pytanie, aby uzyskać wyjaśnienie. – paganotti

+0

zajrzyj do mojej zaktualizowanej odpowiedzi, która powinna wyjaśnić, w jaki sposób możesz zrobić to, o co prosisz. – brice

Odpowiedz

10

TL; DR: Ustaw formatowania wyjście że pisze do baz danych tras RDB w swojej pracy Hadoop:

job.setOutputFormatClass(DBOutputFormat.class); 

Kilka rzeczy do uwaga:

  1. eksportowania danych od MongoDB do Hadoop przy użyciu Sqoop nie jest możliwe. Dzieje się tak dlatego, że Sqoop używa JDBC, który zapewnia interfejs API poziomu połączenia dla baz danych SQL, ale MongoDB nie jest bazą danych opartą na języku SQL. Aby wykonać tę pracę, możesz spojrzeć na numer «MongoDB Connector for Hadoop». Złącze jest dostępne on GitHub. (Edycja: jak podkreślasz w aktualizacji.)

  2. Eksport Sqoop nie jest domyślnie wykonywany w pojedynczej transakcji. Zamiast tego, według Sqoop docs:

    Od Sqoop zepsuje proces eksportu do wielu transakcji, możliwe jest, że nieudana praca eksport może spowodować częściowe dane są zobowiązani do bazy danych.Może to dodatkowo prowadzić do niepowodzenia kolejnych zadań ze względu na kolizje wstawiania w niektórych przypadkach lub prowadzić do powielenia danych w innych. Możesz rozwiązać ten problem, określając tabelę pomostową za pomocą opcji --staging-table, która działa jako tabela pomocnicza, która służy do scentrowania wyeksportowanych danych. Dane etapowe są ostatecznie przenoszone do tabeli docelowej w ramach jednej transakcji.

  3. "Złącze MongoDB dla Hadoop" nie wymusza przepływu pracy, który opisujesz. Zgodnie z docs:

    Ta łączność przybiera formę pozwalając zarówno odczyt danych MongoDB w Hadoop (do wykorzystania w pracy MapReduce, jak również inne składniki ekosystemu Hadoop), a także zapisywania wyników pracy Hadoop do MongoDB.

  4. Rzeczywiście, o ile mi zrozumieć z «MongoDB Connector for Hadoop»: examples byłoby możliwe określenie org.apache.hadoop.mapred.lib.db.DBOutputFormat do swojej pracy Hadoop MapReduce napisać wyjście do bazy danych MySQL. Idąc za przykładem z repozytorium złącza:

    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

polecam Ci przyjrzeć Apache Pig (czyli na wierzchu Hadoop w MAP-redukcji). Zostanie wyprowadzona do MySql (nie trzeba używać Scoop). Użyłem tego, aby zrobić to, co opisujesz. Możliwe jest wykonanie "upsert" z Pig i MySql. Możesz użyć polecenia STORE ze świniami z DBStorage piggyBank i MYSql INSERT DUPLICATE KEY UPDATE (http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html).

0

Użyj złącza MongoHadoop, aby odczytać dane z MongoDB i przetworzyć je za pomocą Hadoop.

Link: https://github.com/mongodb/mongo-hadoop/blob/master/hive/README.md

Używanie tego złącza można używać wieprzowych i gałąź do odczytu danych z Mongo db i przetwarza je przy użyciu Hadoop.

Przykład tabeli 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'); 

Gdy jest eksportowana do ula tabelę można użyć Sqoop lub Pig eksport danych do mysql.

Oto przepływ.

Mongo DB -> Dane procesowe za pomocą wtyczki Mongo DB (Pig) -> Przechowuj do tabeli ula/HDFS -> Eksportuj dane do mysql za pomocą programu sqoop.