sql >> Databáze >  >> NoSQL >> MongoDB

Jak Spark, Python a MongoDB spolupracovat

Aktualizace :

2016-07-04

Od poslední aktualizace MongoDB Spark Connector poměrně hodně dospěl. Poskytuje aktuální binární soubory a API založené na zdroji dat, ale používá SparkConf konfigurace, takže je subjektivně méně flexibilní než Stratio/Spark-MongoDB.

2016-03-30

Od původní odpovědi jsem našel dva různé způsoby, jak se připojit k MongoDB od Spark:

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

Zatímco první se zdá být relativně nevyzrálý, druhý vypadá jako mnohem lepší volba než konektor Mongo-Hadoop a poskytuje 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...|
## +---+----+--------------------+

Zdá se, že je mnohem stabilnější než mongo-hadoop-spark , podporuje predikátový pushdown bez statické konfigurace a jednoduše funguje.

Původní odpověď :

Ve skutečnosti je zde poměrně dost pohyblivých částí. Snažil jsem se to udělat trochu lépe ovladatelným vytvořením jednoduchého obrazu Dockeru, který zhruba odpovídá popsané konfiguraci (i když jsem pro stručnost vynechal knihovny Hadoop). Kompletní zdroj najdete na GitHub (DOI 10.5281/zenodo.47882) a sestavte jej od začátku:

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

nebo si stáhněte obrázek, který jsem poslal do Docker Hub, abyste mohli jednoduše docker pull zero323/mongo-spark ):

Spustit obrázky:

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

Spusťte shell PySpark předáním --jars a --driver-class-path :

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

A nakonec se podívejte, jak to funguje:

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

Upozorňujeme, že mongo-hadoop po první akci zřejmě ukončí spojení. Volání například rdd.count() po shromáždění vyvolá výjimku.

Na základě různých problémů, se kterými jsem se při vytváření tohoto obrázku setkal, mám tendenci věřit, že prošlo mongo-hadoop-1.5.0-SNAPSHOT.jar a mongo-hadoop-spark-1.5.0-SNAPSHOT.jar oběma --jars a --driver-class-path je jediným náročným požadavkem .

Poznámky :

  • Tento obrázek je volně založen na jaceklaskowski/docker-spark, takže pokud to pomůže, nezapomeňte poslat dobrou karmu @jacek-laskowski.
  • Pokud nepotřebujete vývojovou verzi včetně nového rozhraní API, použijte --packages je s největší pravděpodobností lepší varianta.


  1. Vyprázdnit/smazat sadu v Redis?

  2. Jak používat knihovny třetích stran ve glassfish?

  3. MongoDB Node našel, jak zvládnout žádné výsledky?

  4. Jak mohu načíst data z kolekce mongodb do dataFrame pandas?