Mises à jour :
2016-07-04
Depuis la dernière mise à jour, MongoDB Spark Connector a beaucoup évolué. Il fournit des binaires à jour et une API basée sur la source de données, mais il utilise SparkConf
configuration donc subjectivement moins flexible que la Stratio/Spark-MongoDB.
2016-03-30
Depuis la réponse d'origine, j'ai trouvé deux façons différentes de me connecter à MongoDB depuis Spark :
- mongodb/mongo-étincelle
- Stratio/Spark-MongoDB
Alors que le premier semble être relativement immature, le second semble être un bien meilleur choix qu'un connecteur Mongo-Hadoop et fournit une API Spark SQL.
# 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...|
## +---+----+--------------------+
Il semble être beaucoup plus stable que mongo-hadoop-spark
, prend en charge le refoulement de prédicat sans configuration statique et fonctionne simplement.
La réponse originale :
En effet, il y a pas mal de pièces mobiles ici. J'ai essayé de le rendre un peu plus gérable en créant une simple image Docker qui correspond à peu près à la configuration décrite (j'ai cependant omis les bibliothèques Hadoop par souci de brièveté). Vous pouvez trouver la source complète sur GitHub
(DOI 10.5281/zenodo.47882) et créez-le à partir de zéro :
git clone https://github.com/zero323/docker-mongo-spark.git
cd docker-mongo-spark
docker build -t zero323/mongo-spark .
ou téléchargez une image que j'ai poussée vers Docker Hub pour que vous puissiez simplement docker pull zero323/mongo-spark
):
Images de démarrage :
docker run -d --name mongo mongo:2.6
docker run -i -t --link mongo:mongo zero323/mongo-spark /bin/bash
Démarrer le shell PySpark en passant --jars
et --driver-class-path
:
pyspark --jars ${JARS} --driver-class-path ${SPARK_DRIVER_EXTRA_CLASSPATH}
Et enfin voir comment ça marche :
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)]
Veuillez noter que mongo-hadoop semble fermer la connexion après la première action. Donc appeler par exemple rdd.count()
après la collecte lèvera une exception.
Sur la base des différents problèmes que j'ai rencontrés lors de la création de cette image, j'ai tendance à croire que passer mongo-hadoop-1.5.0-SNAPSHOT.jar
et mongo-hadoop-spark-1.5.0-SNAPSHOT.jar
aux deux --jars
et --driver-class-path
est la seule exigence stricte .
Remarques :
- Cette image est vaguement basée sur jaceklaskowski/docker-spark, alors assurez-vous d'envoyer du bon karma à @jacek-laskowski si cela peut vous aider.
- Si vous n'avez pas besoin d'une version de développement incluant une nouvelle API, utilisez alors
--packages
est probablement une meilleure option.