Актуализации :
2016-07-04
След последната актуализация MongoDB Spark Connector узря доста. Той предоставя актуални двоични файлове и API, базиран на източник на данни, но използва SparkConf
конфигурация, така че субективно е по-малко гъвкав от Stratio/Spark-MongoDB.
30.03.2016
От първоначалния отговор открих два различни начина за свързване с MongoDB от Spark:
- mongodb/mongo-spark
- Stratio/Spark-MongoDB
Докато първият изглежда сравнително незрял, вторият изглежда много по-добър избор от конектор Mongo-Hadoop и предоставя Spark SQL API.
# Adjust Scala and package version according to your setup
# although officially 0.11 supports only Spark 1.5
# I haven't encountered any issues on 1.6.1
bin/pyspark --packages com.stratio.datasource:spark-mongodb_2.11:0.11.0
df = (sqlContext.read
.format("com.stratio.datasource.mongodb")
.options(host="mongo:27017", database="foo", collection="bar")
.load())
df.show()
## +---+----+--------------------+
## | x| y| _id|
## +---+----+--------------------+
## |1.0|-1.0|56fbe6f6e4120712c...|
## |0.0| 4.0|56fbe701e4120712c...|
## +---+----+--------------------+
Изглежда, че е много по-стабилен от mongo-hadoop-spark
, поддържа натискане на предикат без статична конфигурация и просто работи.
Оригиналния отговор :
Всъщност тук има доста движещи се части. Опитах се да го направя малко по-управляем, като създадох просто изображение на Docker, което приблизително съответства на описаната конфигурация (все пак пропуснах библиотеките на Hadoop за краткост). Можете да намерите пълен източник на GitHub
(DOI 10.5281/zenodo.47882) и го изградете от нулата:
git clone https://github.com/zero323/docker-mongo-spark.git
cd docker-mongo-spark
docker build -t zero323/mongo-spark .
или изтеглете изображение, което изпратих в Docker Hub, за да можете просто docker pull zero323/mongo-spark
):
Начални изображения:
docker run -d --name mongo mongo:2.6
docker run -i -t --link mongo:mongo zero323/mongo-spark /bin/bash
Стартирайте обвивката на PySpark, предавайки --jars
и --driver-class-path
:
pyspark --jars ${JARS} --driver-class-path ${SPARK_DRIVER_EXTRA_CLASSPATH}
И накрая вижте как работи:
import pymongo
import pymongo_spark
mongo_url = 'mongodb://mongo:27017/'
client = pymongo.MongoClient(mongo_url)
client.foo.bar.insert_many([
{"x": 1.0, "y": -1.0}, {"x": 0.0, "y": 4.0}])
client.close()
pymongo_spark.activate()
rdd = (sc.mongoRDD('{0}foo.bar'.format(mongo_url))
.map(lambda doc: (doc.get('x'), doc.get('y'))))
rdd.collect()
## [(1.0, -1.0), (0.0, 4.0)]
Моля, имайте предвид, че mongo-hadoop изглежда затваря връзката след първото действие. Така че извикване например rdd.count()
след събирането ще изведе изключение.
Въз основа на различни проблеми, с които се сблъсках при създаването на това изображение, съм склонен да вярвам, че преминаването mongo-hadoop-1.5.0-SNAPSHOT.jar
и mongo-hadoop-spark-1.5.0-SNAPSHOT.jar
на двете --jars
и --driver-class-path
е единственото трудно изискване .
Бележки :
- Това изображение е свободно базирано на jaceklaskowski/docker-spark, така че, моля, не забравяйте да изпратите добра карма на @jacek-laskowski, ако това помогне.
- Ако не се нуждаете от версия за разработка, включително нов API, тогава използвайте
--packages
най-вероятно е по-добър вариант.