是否可以读取MongoDB数据,使用Hadoop处理它,并将其输出到RDBS(MySQL)?

pag*_*tti 7 mysql hadoop mongodb sqoop

摘要:

是否有可能:

  1. 使用«MongoDB Connector for Hadoop»将数据导入Hadoop.
  2. 使用Hadoop MapReduce处理它.
  3. 在单个事务中使用Sqoop导出它.

我正在使用MongoDB构建一个Web应用程序.虽然MongoDB适用于大多数工作,但在某些部分我需要更强的事务保证,我使用MySQL数据库.

我的问题是我想读取一个用于数据分析的大型MongoDB集合,但是集合的大小意味着分析工作需要很长时间才能处理.不幸的是,MongoDB的内置map-reduce框架不适合这项工作,所以我更愿意用Apache Hadoop进行分析.

我知道可以通过使用«MongoDB Connector for Hadoop»从MongoDB中读取数据,它从MongoDB读取数据,在Hadoop中使用MapReduce处理它,最后将结果输出回MongoDB数据库.

问题是我希望MapReduce的输出进入MySQL数据库而不是MongoDB,因为结果必须与其他MySQL表合并.

为此,我知道Sqoop可以将Hadoop MapReduce的结果导出到MySQL中.

最后,我想读取MongoDB数据,然后用Hadoop处理它,最后将结果输出到MySQL数据库中.

这可能吗?有哪些工具可以做到这一点?

bri*_*ice 10

TL; DR:设置一个输出格式化程序,写入Hadoop作业中的RDBS:

 job.setOutputFormatClass( DBOutputFormat.class );
Run Code Online (Sandbox Code Playgroud)

有几点需要注意:

  1. 使用Sqoop将数据从MongoDB导出到Hadoop是不可能的.这是因为Sqoop使用JDBC基于SQL的数据库提供调用级API ,但MongoDB 不是基于SQL的数据库.您可以查看«MongoDB Connector for Hadoop»来完成这项工作.连接器在GitHub上可用.(编辑:正如您在更新中指出的那样.)

  2. 默认情况下,Sqoop导出不会在单个事务中进行.相反,根据Sqoop文档:

    由于Sqoop将导出过程分解为多个事务,因此失败的导出作业可能会导致将部分数据提交到数据库.这可能进一步导致后续作业由于某些情况下的插入冲突而失败,或导致其他作业中的重复数据.您可以通过--staging-table选项指定登台表来解决此问题,该选项充当用于暂存导出数据的辅助表.分阶段数据最终在单个事务中移动到目标表.

  3. «MongoDB Connector for Hadoop»似乎并未强制您描述的工作流程.根据文件:

    这种连接的形式允许将MongoDB数据读入Hadoop(用于MapReduce作业以及Hadoop生态系统的其他组件),以及将Hadoop作业的结果写入MongoDB.

  4. 实际上,据我所知,«MongoDB Connector for Hadoop»:示例,可以指定一个org.apache.hadoop.mapred.lib.db.DBOutputFormatHadoop 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 );
    
    Run Code Online (Sandbox Code Playgroud)