使用 Apache Sqoop 将数据从 Mongo/Cassandra 导出到 HDFS

Posted

技术标签:

【中文标题】使用 Apache Sqoop 将数据从 Mongo/Cassandra 导出到 HDFS【英文标题】:Exporting data from Mongo/Cassandra to HDFS using Apache Sqoop 【发布时间】:2014-08-23 20:06:21 【问题描述】:

我有一个问题,我必须通过 Hive 从多个数据源(即 RDBMS(mysql,Oracle)和 NOSQL(MongoDb,Cassandra))读取数据到 HDFS。(增量)

Apache Sqoop 非常适用于 RDBMS,但不适用于 NOSQL,至少我无法成功使用它,(我尝试使用 Mongo 的 JDBC 驱动程序......它能够连接到 Mongo,但是无法推送到 HDFS)

如果有人做过与此相关的任何工作并可以分享它,那将非常有帮助

【问题讨论】:

【参考方案1】:

我使用了一个来自网络的示例,并且能够将文件从 Mongo 传输到 HDFS,反之亦然。我现在无法确定确切的网页。但程序如下所示。

你可以从中得到启发并继续前进。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.bson.BSONObject;
import org.bson.types.ObjectId;

import com.mongodb.hadoop.MongoInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

import com.mongodb.hadoop.util.MongoConfigUtil;

public class CopyFromMongodbToHDFS 

    public static class ImportWeblogsFromMongo extends
            Mapper<LongWritable, Text, Text, Text> 

        public void map(Object key, BSONObject value, Context context)
                throws IOException, InterruptedException 

            System.out.println("Key: " + key);
            System.out.println("Value: " + value);
            String md5 = value.get("md5").toString();
            String url = value.get("url").toString();
            String date = value.get("date").toString();
            String time = value.get("time").toString();
            String ip = value.get("ip").toString();
            String output = "\t" + url + "\t" + date + "\t" + time + "\t" + ip;
            context.write(new Text(md5), new Text(output));

        

    

    public static void main(String[] args) throws IOException,
            InterruptedException, ClassNotFoundException 

        Configuration conf = new Configuration();
        MongoConfigUtil.setInputURI(conf,
                "mongodb://127.0.0.1:27017/test.mylogs");

        System.out.println("Configuration: " + conf);

        @SuppressWarnings("deprecation")
        Job job = new Job(conf, "Mongo Import");

        Path out = new Path("/user/cloudera/test1/logs.txt");

        FileOutputFormat.setOutputPath(job, out);

        job.setJarByClass(CopyFromMongodbToHDFS.class);
        job.setMapperClass(ImportWeblogsFromMongo.class);

        job.setOutputKeyClass(ObjectId.class);
        job.setOutputValueClass(BSONObject.class);

        job.setInputFormatClass(MongoInputFormat.class);
        job.setOutputFormatClass(TextOutputFormat.class);

        job.setNumReduceTasks(0);
        System.exit(job.waitForCompletion(true) ? 0 : 1);

    


【讨论】:

【参考方案2】:

如果是 mongoDB,请创建要导出到 HDFS 的集合的 mongodump。

cd

mongodump -h -d -c

这会创建一个 .bson 格式的转储,例如 "file.bson" 。转换为 .json 格式。 默认情况下,file.bson 将存储在您指定的 的“dump”文件夹中。

bsondump 文件.bson > 文件.json

使用“copyFromLocal”将文件复制到 HDFS。

【讨论】:

以上是关于使用 Apache Sqoop 将数据从 Mongo/Cassandra 导出到 HDFS的主要内容,如果未能解决你的问题,请参考以下文章

Apache Sqoop 和 Spark

错误 - 使用 Apache Sqoop 和 Dataproc 从 SQL Server 导入 GCS

用sqoop将数据从mysql导入hive报错:org.apache.hadoop.mapred.FileAlreadyExistsException: Output

Apache Sqoop 连接错误

Apache Sqoop 2 - 用户指南文档

Sqoop的安装及常用命令