sql >> Database teknologi >  >> NoSQL >> MongoDB

Få Spark, Python og MongoDB til at arbejde sammen

Opdateringer :

2016-07-04

Siden den sidste opdatering er MongoDB Spark Connector modnet ret meget. Det giver up-to-date binære filer og datakildebaseret API, men det bruger SparkConf konfiguration, så den er subjektivt mindre fleksibel end Stratio/Spark-MongoDB.

2016-03-30

Siden det oprindelige svar har jeg fundet to forskellige måder at oprette forbindelse til MongoDB fra Spark på:

  • mongodb/mongo-spark
  • Stratio/Spark-MongoDB

Mens den førstnævnte ser ud til at være relativt umoden, ligner den sidstnævnte et meget bedre valg end en Mongo-Hadoop-forbindelse og giver en 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 ser ud til at være meget mere stabilt end mongo-hadoop-spark , understøtter prædikat pushdown uden statisk konfiguration og virker simpelthen.

Det originale svar :

Der er faktisk en del bevægelige dele her. Jeg forsøgte at gøre det en smule mere overskueligt ved at bygge et simpelt Docker-billede, som nogenlunde matcher den beskrevne konfiguration (jeg har dog udeladt Hadoop-biblioteker for kortheds skyld). Du kan finde komplet kilde på GitHub (DOI 10.5281/zenodo.47882) og byg det fra bunden:

git clone https://github.com/zero323/docker-mongo-spark.git
cd docker-mongo-spark
docker build -t zero323/mongo-spark .

eller download et billede, jeg har skubbet til Docker Hub, så du simpelthen kan docker pull zero323/mongo-spark ):

Startbilleder:

docker run -d --name mongo mongo:2.6
docker run -i -t --link mongo:mongo zero323/mongo-spark /bin/bash

Start PySpark shell ved at sende --jars og --driver-class-path :

pyspark --jars ${JARS} --driver-class-path ${SPARK_DRIVER_EXTRA_CLASSPATH}

Og se endelig, hvordan det virker:

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)]

Bemærk venligst, at mongo-hadoop ser ud til at lukke forbindelsen efter den første handling. Så kalder for eksempel rdd.count() efter indsamlingen vil give en undtagelse.

Baseret på forskellige problemer, jeg er stødt på ved at skabe dette billede, har jeg en tendens til at tro, at bestået mongo-hadoop-1.5.0-SNAPSHOT.jar og mongo-hadoop-spark-1.5.0-SNAPSHOT.jar til begge --jars og --driver-class-path er det eneste hårde krav .

Noter :

  • Dette billede er løst baseret på jaceklaskowski/docker-spark, så sørg for at sende noget god karma til @jacek-laskowski, hvis det hjælper.
  • Hvis du ikke kræver en udviklingsversion inklusive ny API, så brug --packages er højst sandsynligt en bedre mulighed.


  1. MongoError:filterparameter skal være et objekt

  2. MongoDB Aggregation med summen af ​​matrixværdier

  3. MongoDB $ltrim

  4. Hvordan ignorerer man nuller, mens man fjerner et MongoDB-dokument?