因为spark构建在hadoop和hdfs上,所以它兼容任何hdfs数据源,mongo-hadoop connector连接hadoop和mongodb,运行hadoop对mongodb进行直接的读写。所以连接mongodb和spark理论上是可行的
然后怎么配置mongo-hadoop来连接spark.经过一些列的尝试。终于连接完成。
https://github.com/plaa/mongo-spark
不同版本的API
hadoop生态系统充满了不同的和各种不兼容的api版本,最主要的版本改变是hadoop 0.20:旧版的org.apache.hadoop.mapred变成新版的org.apache.hadoop.mapreduce。 同样mongodb-hadoop也有不通的包,spark相应的也有不通的方法hadoopRDD和newAPIHadoopRDD
使用mongo-hadoop
mongo-hadoop的配置参数是通过Configuration对象传递的。其中最重要的参数是mongo.input.uri和mongo.output.uri.
每个mongo的集合作为一个分开的RDD被SparkContext加载。
JavaPairRDD<Object, BSONObject> rdd = sc.newAPIHadoopRDD(config, MongoInputFormat.class, Object.class, BSONObject.class);
这里使用新的api。MongoInputFormt必须从com.mongodb.hadoop中导入。
返回的类型是RDD<Object,BSONObject>.第一个参数是一个ObjectId实例,就是mongodb文档的对象ID,第二个参数就是包含BSON文档。
保存一个RDD到mongodb使用了
saveAsNewAPIHadoopFile
方法。
rdd.saveAsNewAPIHadoopFile("
file:///bogus
", Object.class, Object.class, MongoOutputFormat.class, config);