MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Faire fonctionner Spark, Python et MongoDB ensemble

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.