MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Współpraca Sparka, Pythona i MongoDB

Aktualizacje :

04.07.2016

Od ostatniej aktualizacji MongoDB Spark Connector całkiem dojrzał. Zapewnia aktualne pliki binarne i API oparte na źródłach danych, ale używa SparkConf konfiguracja, więc jest subiektywnie mniej elastyczny niż Stratio/Spark-MongoDB.

30.03.2016

Od czasu pierwotnej odpowiedzi znalazłem dwa różne sposoby łączenia się z MongoDB ze Sparka:

  • mongodb/mongo-iskra
  • Stretio/Spark-MongoDB

Podczas gdy ta pierwsza wydaje się być stosunkowo niedojrzała, ta druga wygląda na znacznie lepszy wybór niż złącze Mongo-Hadoop i zapewnia interfejs 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...|
## +---+----+--------------------+

Wydaje się być znacznie bardziej stabilny niż mongo-hadoop-spark , obsługuje predykat w dół bez konfiguracji statycznej i po prostu działa.

Oryginalna odpowiedź :

Rzeczywiście, jest tu sporo ruchomych części. Starałem się, aby było to trochę łatwiejsze w zarządzaniu, budując prosty obraz Dockera, który z grubsza pasuje do opisanej konfiguracji (pominąłem jednak biblioteki Hadoop dla zwięzłości). Możesz znaleźć pełne źródło na GitHub (DOI 10.5281/zenodo.47882) i zbuduj go od podstaw:

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

lub pobierz obraz, który wypchnąłem do Docker Hub, dzięki czemu możesz po prostu docker pull zero323/mongo-spark ):

Obrazy startowe:

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

Uruchom powłokę PySpark przekazując --jars i --driver-class-path :

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

I na koniec zobacz, jak to działa:

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

Należy pamiętać, że mongo-hadoop wydaje się zamykać połączenie po pierwszej akcji. Wywołując na przykład rdd.count() po zebraniu zgłosi wyjątek.

W oparciu o różne problemy, które napotkałem podczas tworzenia tego obrazu, wierzę, że przejście mongo-hadoop-1.5.0-SNAPSHOT.jar i mongo-hadoop-spark-1.5.0-SNAPSHOT.jar do obu --jars i --driver-class-path to jedyne trudne wymaganie .

Notatki :

  • Ten obraz jest luźno oparty na jaceklaskowskim/docker-spark, więc jeśli to pomoże, wyślij trochę dobrej karmy do @jacek-laskowski.
  • Jeśli nie potrzebujesz wersji rozwojowej zawierającej nowy interfejs API, użyj --packages jest najprawdopodobniej lepszą opcją.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Dostęp do bazy danych produkcji meteorów w 2016 r.

  2. Zapytanie o datę z ISODate w mongodb nie działa

  3. Podziel ciąg na tablicę podciągów lub znaków w MongoDB

  4. Mongoose — RangeError:przekroczono maksymalny rozmiar stosu wywołań

  5. Jak ustawić limit czasu dla zapytania Mongoose?