使用 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 将存储在您指定的
bsondump 文件.bson > 文件.json
使用“copyFromLocal”将文件复制到 HDFS。
【讨论】:
以上是关于使用 Apache Sqoop 将数据从 Mongo/Cassandra 导出到 HDFS的主要内容,如果未能解决你的问题,请参考以下文章
错误 - 使用 Apache Sqoop 和 Dataproc 从 SQL Server 导入 GCS
用sqoop将数据从mysql导入hive报错:org.apache.hadoop.mapred.FileAlreadyExistsException: Output