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ą.