在Worker的帮助下从Spark读取巨大的MongoDB集合

时间:2015-09-09 02:19:47

标签: mongodb scala apache-spark casbah

我想从Spark中读取一个巨大的MongoDB集合,创建一个持久的RDD并对其进行进一步的数据分析。

有什么方法可以更快地从MongoDB读取数据。 尝试过使用MongoDB Java + Casbah

的方法

我可以使用worker / slave从MongoDB并行读取数据,然后将其保存为持久数据并使用它。

1 个答案:

答案 0 :(得分:2)

有两种方法可以将数据从MongoDB传输到Apache Spark。

方法1: 使用Casbah(MongDB Java驱动程序层)

val uriRemote = MongoClientURI("mongodb://RemoteURL:27017/")
val mongoClientRemote =  MongoClient(uriRemote)
val dbRemote = mongoClientRemote("dbName")
val collectionRemote = dbRemote("collectionName")
val ipMongo = collectionRemote.find
val ipRDD = sc.makeRDD(ipMongo.toList)
ipRDD.saveAsTextFile("hdfs://path/to/hdfs")

在这里,我们使用Scala和Casbah先获取数据,然后将其保存到HDFS。

方法2:我们使用的Spark Worker

更好的代码版本:使用Spark worker和多核用于在短时间内获取数据。

val config = new Configuration()
config.set("mongo.job.input.format","com.mongodb.hadoop.MongoInputFormat")
config.set("mongo.input.uri", "mongodb://RemoteURL:27017/dbName.collectionName")
val keyClassName = classOf[Object]
val valueClassName = classOf[BSONObject]
val inputFormatClassName = classOf[com.mongodb.hadoop.MongoInputFormat]
val ipRDD = sc.newAPIHadoopRDD(config,inputFormatClassName,keyClassName,valueClassName)
ipRDD.saveAsTextFile("hdfs://path/to/hdfs")