sql >> Databasteknik >  >> NoSQL >> MongoDB

Få Spark, Python och MongoDB att fungera tillsammans

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.


  1. Spara en HASH till Redis på en rails-app

  2. [Infographic] Jämför Cassandra vs. MongoDB

  3. Finns det ett sätt att automatiskt upptäcka ny klusternod IP i Redis Cluster med sallad

  4. Effektivt sätt att kartlägga data från Redis