MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Spark, Python und MongoDB zusammenarbeiten lassen

Aktualisierungen :

2016-07-04

Seit dem letzten Update ist der MongoDB Spark Connector ziemlich gereift. Es bietet aktuelle Binärdateien und eine auf Datenquellen basierende API, verwendet jedoch SparkConf Konfiguration, sodass sie subjektiv weniger flexibel ist als die Stratio/Spark-MongoDB.

30.03.2016

Seit der ursprünglichen Antwort habe ich zwei verschiedene Möglichkeiten gefunden, um von Spark aus eine Verbindung zu MongoDB herzustellen:

  • mongodb/mongo-spark
  • Stratio/Spark-MongoDB

Während Ersteres relativ unausgereift zu sein scheint, scheint Letzteres eine viel bessere Wahl zu sein als ein Mongo-Hadoop-Konnektor und bietet eine 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...|
## +---+----+--------------------+

Es scheint viel stabiler zu sein als mongo-hadoop-spark , unterstützt Prädikat-Pushdown ohne statische Konfiguration und funktioniert einfach.

Die ursprüngliche Antwort :

Tatsächlich gibt es hier einige bewegliche Teile. Ich habe versucht, es etwas überschaubarer zu machen, indem ich ein einfaches Docker-Image erstellt habe, das in etwa der beschriebenen Konfiguration entspricht (ich habe jedoch der Kürze halber Hadoop-Bibliotheken weggelassen). Den vollständigen Quellcode finden Sie auf GitHub (DOI 10.5281/zenodo.47882) und von Grund auf neu erstellen:

git clone https://github.com/zero323/docker-mongo-spark.git
cd docker-mongo-spark
docker build -t zero323/mongo-spark .

oder laden Sie ein Image herunter, das ich an Docker Hub gepusht habe, damit Sie einfach docker pull zero323/mongo-spark können ):

Bilder starten:

docker run -d --name mongo mongo:2.6
docker run -i -t --link mongo:mongo zero323/mongo-spark /bin/bash

Starten Sie die PySpark-Shell und übergeben Sie --jars und --driver-class-path :

pyspark --jars ${JARS} --driver-class-path ${SPARK_DRIVER_EXTRA_CLASSPATH}

Und endlich sehen, wie es funktioniert:

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)]

Bitte beachten Sie, dass mongo-hadoop die Verbindung nach der ersten Aktion zu schließen scheint. Also Aufruf zum Beispiel rdd.count() nach dem Sammeln wird eine Ausnahme ausgelöst.

Basierend auf verschiedenen Problemen, auf die ich beim Erstellen dieses Bildes gestoßen bin, neige ich dazu zu glauben, dass bestanden mongo-hadoop-1.5.0-SNAPSHOT.jar und mongo-hadoop-spark-1.5.0-SNAPSHOT.jar auf beide --jars und --driver-class-path ist die einzige harte Anforderung .

Notizen :

  • Dieses Bild basiert lose auf jaceklaskowski/docker-spark, also senden Sie bitte etwas gutes Karma an @jacek-laskowski, wenn es hilft.
  • Wenn Sie keine Entwicklungsversion mit neuer API benötigen, verwenden Sie --packages ist höchstwahrscheinlich eine bessere Option.