MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Накарайте Spark, Python и MongoDB да работят заедно

Актуализации :

2016-07-04

След последната актуализация MongoDB Spark Connector узря доста. Той предоставя актуални двоични файлове и API, базиран на източник на данни, но използва SparkConf конфигурация, така че субективно е по-малко гъвкав от Stratio/Spark-MongoDB.

30.03.2016

От първоначалния отговор открих два различни начина за свързване с MongoDB от Spark:

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

Докато първият изглежда сравнително незрял, вторият изглежда много по-добър избор от конектор Mongo-Hadoop и предоставя 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...|
## +---+----+--------------------+

Изглежда, че е много по-стабилен от mongo-hadoop-spark , поддържа натискане на предикат без статична конфигурация и просто работи.

Оригиналния отговор :

Всъщност тук има доста движещи се части. Опитах се да го направя малко по-управляем, като създадох просто изображение на Docker, което приблизително съответства на описаната конфигурация (все пак пропуснах библиотеките на Hadoop за краткост). Можете да намерите пълен източник на GitHub (DOI 10.5281/zenodo.47882) и го изградете от нулата:

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

или изтеглете изображение, което изпратих в Docker Hub, за да можете просто docker pull zero323/mongo-spark ):

Начални изображения:

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

Стартирайте обвивката на PySpark, предавайки --jars и --driver-class-path :

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

И накрая вижте как работи:

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

Моля, имайте предвид, че mongo-hadoop изглежда затваря връзката след първото действие. Така че извикване например rdd.count() след събирането ще изведе изключение.

Въз основа на различни проблеми, с които се сблъсках при създаването на това изображение, съм склонен да вярвам, че преминаването mongo-hadoop-1.5.0-SNAPSHOT.jar и mongo-hadoop-spark-1.5.0-SNAPSHOT.jar на двете --jars и --driver-class-path е единственото трудно изискване .

Бележки :

  • Това изображение е свободно базирано на jaceklaskowski/docker-spark, така че, моля, не забравяйте да изпратите добра карма на @jacek-laskowski, ако това помогне.
  • Ако не се нуждаете от версия за разработка, включително нов API, тогава използвайте --packages най-вероятно е по-добър вариант.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $subtract

  2. Поддържа ли MongoDB типове с плаваща запетая?

  3. Как да премахнете документ, посочен от идентификатор в mongoDB от php?

  4. Създайте реактивна публикация с допълнителни полета във всеки документ

  5. Как да изпълня MongoDB js скрипт с помощта на Java MongoDriver