Aggiornamenti :
04-07-2016
Dall'ultimo aggiornamento MongoDB Spark Connector è maturato parecchio. Fornisce binari aggiornati e API basate sull'origine dati ma utilizza SparkConf
configurazione quindi è soggettivamente meno flessibile di Stratio/Spark-MongoDB.
30-03-2016
Dalla risposta originale ho trovato due modi diversi per connettermi a MongoDB da Spark:
- mongodb/mongo-spark
- Strato/Spark-MongoDB
Mentre il primo sembra essere relativamente immaturo, il secondo sembra una scelta molto migliore rispetto a un connettore Mongo-Hadoop e fornisce un'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...|
## +---+----+--------------------+
Sembra essere molto più stabile di mongo-hadoop-spark
, supporta il pushdown del predicato senza configurazione statica e funziona semplicemente.
La risposta originale :
In effetti, qui ci sono alcune parti mobili. Ho cercato di renderlo un po' più gestibile costruendo una semplice immagine Docker che corrispondesse grosso modo alla configurazione descritta (per brevità ho però omesso le librerie Hadoop). Puoi trovare la fonte completa su GitHub
(DOI 10.5281/zenodo.47882) e costruiscilo da zero:
git clone https://github.com/zero323/docker-mongo-spark.git
cd docker-mongo-spark
docker build -t zero323/mongo-spark .
o scarica un'immagine che ho inviato a Docker Hub in modo da poter semplicemente docker pull zero323/mongo-spark
):
Inizia immagini:
docker run -d --name mongo mongo:2.6
docker run -i -t --link mongo:mongo zero323/mongo-spark /bin/bash
Avvia la shell di PySpark passando --jars
e --driver-class-path
:
pyspark --jars ${JARS} --driver-class-path ${SPARK_DRIVER_EXTRA_CLASSPATH}
E finalmente guarda come funziona:
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)]
Si noti che mongo-hadoop sembra chiudere la connessione dopo la prima azione. Quindi chiamando ad esempio rdd.count()
dopo la raccolta genererà un'eccezione.
In base ai diversi problemi che ho riscontrato durante la creazione di questa immagine, tendo a credere che passi mongo-hadoop-1.5.0-SNAPSHOT.jar
e mongo-hadoop-spark-1.5.0-SNAPSHOT.jar
a entrambi --jars
e --driver-class-path
è l'unico requisito difficile .
Note :
- Questa immagine è vagamente basata su jaceklaskowski/docker-spark quindi assicurati di inviare del buon karma a @jacek-laskowski se può essere d'aiuto.
- Se non è necessaria una versione di sviluppo che includa la nuova API, utilizzare
--packages
è molto probabilmente un'opzione migliore.