Updates :
04-07-2016
Sinds de laatste update is MongoDB Spark Connector behoorlijk volwassen geworden. Het biedt up-to-date binaire bestanden en op gegevensbronnen gebaseerde API, maar het gebruikt SparkConf
configuratie, dus het is subjectief minder flexibel dan de Statio/Spark-MongoDB.
30-03-2016
Sinds het oorspronkelijke antwoord heb ik twee verschillende manieren gevonden om vanuit Spark verbinding te maken met MongoDB:
- mongodb/mongo-spark
- Stratio/Spark-MongoDB
Hoewel de eerste relatief onvolwassen lijkt, lijkt de laatste een veel betere keuze dan een Mongo-Hadoop-connector en biedt een 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...|
## +---+----+--------------------+
Het lijkt veel stabieler dan mongo-hadoop-spark
, ondersteunt predikaat pushdown zonder statische configuratie en werkt gewoon.
Het oorspronkelijke antwoord :
Er zijn hier inderdaad nogal wat bewegende delen. Ik heb geprobeerd het een beetje beheersbaarder te maken door een eenvoudige Docker-afbeelding te bouwen die ongeveer overeenkomt met de beschreven configuratie (ik heb Hadoop-bibliotheken echter weggelaten voor de beknoptheid). Je kunt de volledige bron vinden op GitHub
(DOI 10.5281/zenodo.47882) en bouw het helemaal opnieuw op:
git clone https://github.com/zero323/docker-mongo-spark.git
cd docker-mongo-spark
docker build -t zero323/mongo-spark .
of download een afbeelding die ik naar Docker Hub heb gepusht, zodat je eenvoudig kunt docker pull zero323/mongo-spark
):
Afbeeldingen starten:
docker run -d --name mongo mongo:2.6
docker run -i -t --link mongo:mongo zero323/mongo-spark /bin/bash
Start PySpark-shell en geef --jars
door en --driver-class-path
:
pyspark --jars ${JARS} --driver-class-path ${SPARK_DRIVER_EXTRA_CLASSPATH}
En kijk eindelijk hoe het werkt:
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)]
Houd er rekening mee dat mongo-hadoop de verbinding lijkt te sluiten na de eerste actie. Dus bijvoorbeeld rdd.count()
. aanroepen na het verzamelen wordt een uitzondering gegenereerd.
Op basis van verschillende problemen die ik ben tegengekomen bij het maken van deze afbeelding, ben ik geneigd te geloven dat voorbijgaan mongo-hadoop-1.5.0-SNAPSHOT.jar
en mongo-hadoop-spark-1.5.0-SNAPSHOT.jar
naar beide --jars
en --driver-class-path
is de enige harde vereiste .
Opmerkingen :
- Deze afbeelding is losjes gebaseerd op jaceklaskowski/docker-spark, dus stuur alsjeblieft wat goed karma naar @jacek-laskowski als dat helpt.
- Als je geen ontwikkelversie nodig hebt inclusief nieuwe API, gebruik dan
--packages
is waarschijnlijk een betere optie.