instalar how find_one docs create consulta como python mongodb hadoop apache-spark pymongo

how - pymongo docs python



Conseguir que Spark, Python y MongoDB trabajen juntos (4)

Tengo dificultades para lograr que estos componentes se unan correctamente. Tengo Spark instalado y trabajando con éxito, puedo ejecutar trabajos localmente, de forma independiente y también a través de YARN. He seguido los pasos recomendados (hasta donde sé) here y here

Estoy trabajando en Ubuntu y las diversas versiones de componentes que tengo son

Tuve algunas dificultades para seguir los diversos pasos, como qué jarras agregar a qué ruta, así que lo que he agregado son

  • en /usr/local/share/hadoop-2.6.1/share/hadoop/mapreduce he agregado mongo-hadoop-core-1.5.0-SNAPSHOT.jar
  • las siguientes variables de entorno
    • export HADOOP_HOME="/usr/local/share/hadoop-2.6.1"
    • export PATH=$PATH:$HADOOP_HOME/bin
    • export SPARK_HOME="/usr/local/share/spark-1.5.1-bin-hadoop2.6"
    • export PYTHONPATH="/usr/local/share/mongo-hadoop/spark/src/main/python"
    • export PATH=$PATH:$SPARK_HOME/bin

Mi programa Python es básico

from pyspark import SparkContext, SparkConf import pymongo_spark pymongo_spark.activate() def main(): conf = SparkConf().setAppName("pyspark test") sc = SparkContext(conf=conf) rdd = sc.mongoRDD( ''mongodb://username:password@localhost:27017/mydb.mycollection'') if __name__ == ''__main__'': main()

Lo estoy ejecutando usando el comando

$SPARK_HOME/bin/spark-submit --driver-class-path /usr/local/share/mongo-hadoop/spark/build/libs/ --master local[4] ~/sparkPythonExample/SparkPythonExample.py

y estoy obteniendo el siguiente resultado como resultado

Traceback (most recent call last): File "/home/me/sparkPythonExample/SparkPythonExample.py", line 24, in <module> main() File "/home/me/sparkPythonExample/SparkPythonExample.py", line 17, in main rdd = sc.mongoRDD(''mongodb://username:password@localhost:27017/mydb.mycollection'') File "/usr/local/share/mongo-hadoop/spark/src/main/python/pymongo_spark.py", line 161, in mongoRDD return self.mongoPairRDD(connection_string, config).values() File "/usr/local/share/mongo-hadoop/spark/src/main/python/pymongo_spark.py", line 143, in mongoPairRDD _ensure_pickles(self) File "/usr/local/share/mongo-hadoop/spark/src/main/python/pymongo_spark.py", line 80, in _ensure_pickles orig_tb) py4j.protocol.Py4JError

Segun here

Esta excepción se produce cuando se produce una excepción en el código del cliente Java. Por ejemplo, si intenta hacer estallar un elemento de una pila vacía. La instancia de la excepción Java lanzada se almacena en el miembro java_exception.

Mirando el código fuente de pymongo_spark.py y la línea que arroja el error, dice

"Error al comunicarse con la JVM. ¿Está el MongoDB Spark jar en el CLASSPATH de Spark?:"

En respuesta, he tratado de asegurarme de que se pasan los frascos correctos, pero podría estar haciendo todo esto mal, ver a continuación

$SPARK_HOME/bin/spark-submit --jars /usr/local/share/spark-1.5.1-bin-hadoop2.6/lib/mongo-hadoop-spark-1.5.0-SNAPSHOT.jar,/usr/local/share/spark-1.5.1-bin-hadoop2.6/lib/mongo-java-driver-3.0.4.jar --driver-class-path /usr/local/share/spark-1.5.1-bin-hadoop2.6/lib/mongo-java-driver-3.0.4.jar,/usr/local/share/spark-1.5.1-bin-hadoop2.6/lib/mongo-hadoop-spark-1.5.0-SNAPSHOT.jar --master local[4] ~/sparkPythonExample/SparkPythonExample.py

He importado pymongo al mismo programa de Python para verificar que al menos puedo acceder a MongoDB usando eso, y puedo.

Sé que hay bastantes piezas móviles aquí, así que si puedo proporcionar más información útil, hágamelo saber.


¡Buena suerte!

@ver here

from pyspark import SparkContext, SparkConf import pymongo_spark # Important: activate pymongo_spark. pymongo_spark.activate() def main(): conf = SparkConf().setAppName("pyspark test") sc = SparkContext(conf=conf) # Create an RDD backed by the MongoDB collection. # This RDD *does not* contain key/value pairs, just documents. # If you want key/value pairs, use the mongoPairRDD method instead. rdd = sc.mongoRDD(''mongodb://localhost:27017/db.collection'') # Save this RDD back to MongoDB as a different collection. rdd.saveToMongoDB(''mongodb://localhost:27017/db.other.collection'') # You can also read and write BSON: bson_rdd = sc.BSONFileRDD(''/path/to/file.bson'') bson_rdd.saveToBSON(''/path/to/bson/output'') if __name__ == ''__main__'': main()


¿Puede intentar usar la opción --package lugar de --jars ... en su comando spark-submit:

spark-submit --packages org.mongodb.mongo-hadoop:mongo-hadoop-core:1.3.1,org.mongodb:mongo-java-driver:3.1.0 [REST OF YOUR OPTIONS]

Algunos de estos archivos jar no son jarras Uber y necesitan más dependencias para descargarse antes de que puedan funcionar.


Estaba teniendo este mismo problema ayer. mongo-java-driver.jar solucionarlo colocando mongo-java-driver.jar en $HADOOP_HOME/lib y mongo-hadoop-core.jar y mongo-hadoop-spark.jar en $HADOOP_HOME/spark/classpath/emr (o cualquier otra carpeta que está en $SPARK_CLASSPATH ).

Avísame si eso ayuda.


Actualizaciones :

2016-07-04

Desde la última actualización, MongoDB Spark Connector ha madurado bastante. Proporciona binarios actualizados y API basada en el origen de datos, pero está utilizando la configuración de SparkConf , por lo que es subjetivamente menos flexible que el Stratio / Spark-MongoDB.

2016-03-30

Desde la respuesta original, encontré dos formas diferentes de conectarme a MongoDB desde Spark:

Mientras que el primero parece ser relativamente inmaduro, el último parece una opción mucho mejor que un conector Mongo-Hadoop y proporciona una API Spark SQL.

# 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...| ## +---+----+--------------------+

Parece ser mucho más estable que mongo-hadoop-spark , admite el empuje de predicados sin configuración estática y simplemente funciona.

La respuesta original :

De hecho, hay bastantes partes móviles aquí. Intenté hacerlo un poco más manejable construyendo una imagen simple de Docker que coincida aproximadamente con la configuración descrita (aunque he omitido las bibliotecas de Hadoop por brevedad). Puede encontrar la fuente completa en GitHub ( DOI 10.5281 / zenodo.47882 ) y compilarla desde cero:

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

o descargue una imagen que he enviado a Docker Hub para que pueda simplemente docker pull zero323/mongo-spark ):

Imágenes de inicio:

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

Inicie el shell de PySpark pasando --jars y --driver-class-path :

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

Y finalmente ver cómo funciona:

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

Tenga en cuenta que mongo-hadoop parece cerrar la conexión después de la primera acción. Por lo tanto, llamar por ejemplo a rdd.count() después del cobro arrojará una excepción.

Según los diferentes problemas que he encontrado al crear esta imagen, tiendo a creer que pasar mongo-hadoop-1.5.0-SNAPSHOT.jar y mongo-hadoop-spark-1.5.0-SNAPSHOT.jar a ambos --jars y --driver-class-path es el único requisito difícil .

Notas :

  • Esta imagen se basa libremente en jaceklaskowski/docker-spark así que asegúrese de enviar un buen karma a @jacek-laskowski si es @jacek-laskowski .
  • Si no requiere una versión de desarrollo que incluya una nueva API, entonces usar --packages es probablemente una mejor opción.