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
- Spark spark-1.5.1-bin-hadoop2.6
- Hadoop hadoop-2.6.1
- Mongo 2.6.10
- Conector Mongo-Hadoop clonado de https://github.com/mongodb/mongo-hadoop.git
- Python 2.7.10
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 agregadomongo-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.