2012-04-01 13 views
7

Resumen:

¿Es posible:¿Es posible leer datos de MongoDB, procesarlos con Hadoop y enviarlos a un RDBS (MySQL)?

  1. Importar datos en Hadoop con el «Conector MongoDB para Hadoop».
  2. Procéselo con Hadoop MapReduce.
  3. Exportar con Sqoop en una sola transacción.

Estoy construyendo una aplicación web con MongoDB. Aunque MongoDB funciona bien durante la mayor parte del trabajo, en algunas partes necesito garantías transaccionales más sólidas, para lo cual utilizo una base de datos MySQL.

Mi problema es que quiero leer una gran colección MongoDB para el análisis de datos, pero el tamaño de la colección significa que el trabajo analítico demorará demasiado en procesarse. Desafortunadamente, el framework de reducción de mapas integrado de MongoDB no funcionaría bien para este trabajo, por lo que preferiría llevar a cabo el análisis con Apache Hadoop.

Entiendo que es posible leer datos de MongoDB en Hadoop utilizando «MongoDB Connector for Hadoop», que lee datos de MongoDB, los procesa con MapReduce en Hadoop y finalmente los devuelve a una base de datos MongoDB.

El problema es que quiero que la salida de MapReduce vaya a una base de datos MySQL, en lugar de a MongoDB, porque los resultados deben combinarse con otras tablas de MySQL.

Para este propósito, sé que Sqoop puede exportar el resultado de un Hadoop MapReduce a MySQL.

En última instancia, también quiero leer los datos de MongoDB, luego procesarlos con Hadoop y finalmente enviar el resultado a una base de datos MySQL.

¿Esto es posible? ¿Qué herramientas están disponibles para hacer esto?

+0

su pregunta podría hacerse mucho más clara. No estoy seguro de lo que estás tratando de hacer. Editaré tu pregunta para reflejar lo que creo que estás tratando de decir, pero tu aclaración también sería útil. – brice

+0

Actualizo mi pregunta para aclarar – paganotti

+0

eche un vistazo a mi respuesta actualizada, que debe explicar cómo puede hacer lo que está pidiendo. – brice

Respuesta

10

TL; DR: Establecer un formateador una salida que escribe a un RDBS en su trabajo Hadoop:

job.setOutputFormatClass(DBOutputFormat.class); 

Hay varias cosas a tener en cuenta:

  1. La exportación de datos de MongoDB a Hadoop usando Sqoop no es posible. Esto se debe a que Sqoop usa JDBC que proporciona una API de nivel de llamada para base de datos SQL, pero MongoDB no es una base de datos basada en SQL. Puede mirar el «MongoDB Connector for Hadoop» para hacer este trabajo. El conector está disponible on GitHub. (Editar: como indica en su actualización.)

  2. Las exportaciones de Sqoop no se realizan en una sola transacción de forma predeterminada. En cambio, de acuerdo con el Sqoop docs:

    Desde Sqoop descompone proceso de exportación en múltiples transacciones, es posible que un trabajo de exportación no puede resultar en datos parciales que se cometen a la base de datos.Esto puede conducir a fallas posteriores debido a colisiones de inserción en algunos casos, o a duplicar datos en otros. Puede solucionar este problema especificando una tabla de etapas a través de la opción --staging-table que actúa como una tabla auxiliar que se utiliza para organizar los datos exportados. Los datos por etapas finalmente se mueven a la tabla de destino en una sola transacción.

  3. El «Conector MongoDB para Hadoop» no parece forzar el flujo de trabajo que usted describe. De acuerdo con los documentos:

    Esta conectividad toma la forma de permitir que tanto la lectura de datos MongoDB en Hadoop (para su uso en trabajos de MapReduce, así como otros componentes del ecosistema Hadoop), además de escribir los resultados de los trabajos de Hadoop a MongoDB.

  4. De hecho, por lo que yo entiendo de la «MongoDB Connector for Hadoop»: examples, sería posible especificar un org.apache.hadoop.mapred.lib.db.DBOutputFormat en su trabajo Hadoop MapReduce para escribir el resultado en una base de datos MySQL. Siguiendo el ejemplo del repositorio de conector:

    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

te recomendaría que echar un vistazo a Apache Pig (que se ejecuta en la parte superior de un mapa-reducir de Hadoop). Saldrá a MySql (no es necesario usar Scoop). Lo usé para hacer lo que describes. Es posible hacer un "upsert" con Pig y MySql. Puede usar el comando STORE de PiggyBank con DBStorage de piggyBank e INSERT DUPLICATE KEY UPDATE de MySql (http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html).

0

Utilice el conector MongoHadoop para leer datos de MongoDB y procesarlos utilizando Hadoop.

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

El uso de este conector se puede utilizar cerdo y Colmena para leer datos de Mongo db y procesarlo utilizando Hadoop.

ejemplo de la Tabla Mongo Colmena:

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'); 

Una vez que se exporta a la colmena tabla puede utilizar Sqoop o cerdo para exportar datos a MySQL.

Aquí hay un flujo.

Mongo DB -> Procesar datos usando el conector hadoop Mongo DB (Pig) -> Almacenarlo en la tabla de colmenas/HDFS -> Exportar datos a mysql usando sqoop.

Cuestiones relacionadas