Uppdateringar :
2016-07-04
Sedan den senaste uppdateringen har MongoDB Spark Connector mognat ganska mycket. Den tillhandahåller uppdaterade binärer och datakällasbaserade API men den använder SparkConf
konfiguration så att den är subjektivt mindre flexibel än Stratio/Spark-MongoDB.
2016-03-30
Sedan det ursprungliga svaret hittade jag två olika sätt att ansluta till MongoDB från Spark:
- mongodb/mongo-spark
- Stratio/Spark-MongoDB
Medan den förra verkar vara relativt omogen, ser den senare ut som ett mycket bättre val än en Mongo-Hadoop-kontakt och ger ett 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...|
## +---+----+--------------------+
Det verkar vara mycket mer stabilt än mongo-hadoop-spark
, stöder predikat pushdown utan statisk konfiguration och fungerar helt enkelt.
Det ursprungliga svaret :
Det finns faktiskt en hel del rörliga delar här. Jag försökte göra det lite mer hanterbart genom att bygga en enkel Docker-bild som ungefär matchar den beskrivna konfigurationen (jag har dock utelämnat Hadoop-bibliotek för korthetens skull). Du kan hitta fullständig källa på GitHub
(DOI 10.5281/zenodo.47882) och bygg den från grunden:
git clone https://github.com/zero323/docker-mongo-spark.git
cd docker-mongo-spark
docker build -t zero323/mongo-spark .
eller ladda ner en bild som jag har skickat till Docker Hub så att du helt enkelt kan docker pull zero323/mongo-spark
):
Startbilder:
docker run -d --name mongo mongo:2.6
docker run -i -t --link mongo:mongo zero323/mongo-spark /bin/bash
Starta PySpark-skalet genom att skicka --jars
och --driver-class-path
:
pyspark --jars ${JARS} --driver-class-path ${SPARK_DRIVER_EXTRA_CLASSPATH}
Och se till sist hur det fungerar:
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)]
Observera att mongo-hadoop verkar stänga anslutningen efter den första åtgärden. Så kallar till exempel rdd.count()
efter insamlingen kommer att ge ett undantag.
Baserat på olika problem som jag har stött på när jag skapade den här bilden tenderar jag att tro att godkänd mongo-hadoop-1.5.0-SNAPSHOT.jar
och mongo-hadoop-spark-1.5.0-SNAPSHOT.jar
till båda --jars
och --driver-class-path
är det enda hårda kravet .
Anteckningar :
- Denna bild är löst baserad på jaceklaskowski/docker-spark så se till att skicka lite bra karma till @jacek-laskowski om det hjälper.
- Om du inte kräver en utvecklingsversion inklusive nytt API, använd
--packages
är troligen ett bättre alternativ.