36 votos

Que chispa, Python y MongoDB para trabajar juntos

Estoy teniendo dificultades para conseguir estos componentes para unir correctamente. Tengo Chispa instalado y funciona correctamente, puedo ejecutar trabajos a nivel local, independiente, y también a través del HILO. He seguido los pasos que aconseja (al mejor de mi conocimiento) aquí y aquí

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

Tuve algunas dificultades a raíz de las diversas medidas, tales como que los frascos para agregar a los que camino, así que lo he añadido son

  • en /usr/local/share/hadoop-2.6.1/share/hadoop/mapreduce he añadido 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 en 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()

Yo estoy 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

De acuerdo a aquí

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

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

"Error al comunicarse con el JVM. Es la MongoDB Chispa jar La chispa de la ruta de clases? : "

Así que, en respuesta he intentado asegúrese de que el derecho de los frascos se pasan, pero yo podría estar haciendo esta 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 para el mismo programa en python para comprobar que puedo, al menos, el acceso de MongoDB con eso, y me puede.

Sé que hay muy pocas partes móviles aquí, así que si me puede proporcionar más información útil por favor hágamelo saber.

16voto

zero323 Puntos 5699

De hecho, hay muy pocas partes móviles aquí. Así que vamos a intentar hacer un poco más manejable. Voy a empezar con una ventana acoplable imagen que a grandes rasgos coincide con lo descrito en la configuración. He omitido Hadoop bibliotecas de la brevedad.

FROM ubuntu:14.04

# See https://github.com/phusion/baseimage-docker/issues/58
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections

RUN apt-get update \
    && apt-get install -y wget ipython build-essential python-dev python-pip openjdk-7-jdk \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* 

RUN pip install pymongo

ENV SPARK_VERSION 1.5.2
ENV HADOOP_VERSION 2.6
ENV MONGO_HADOOP_VERSION 1.5.0
ENV MONGO_HADOOP_COMMIT 9905150ec5f8f7b74bc998cc36f53d0a6f83ee49

ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64
ENV SPARK_HOME /usr/local/spark

ENV APACHE_MIRROR http://ftp.ps.pl/pub/apache
ENV SPARK_URL ${APACHE_MIRROR}/spark/spark-${SPARK_VERSION}/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz
ENV SPARK_DIR spark-${SPARK_VERSION}-bin-hadoop2.6

ENV MONGO_HADOOP_URL https://github.com/mongodb/mongo-hadoop/archive/${MONGO_HADOOP_COMMIT}.tar.gz

ENV MONGO_HADOOP_LIB_PATH /usr/local/mongo-hadoop/build/libs
ENV MONGO_HADOOP_JAR  ${MONGO_HADOOP_LIB_PATH}/mongo-hadoop-${MONGO_HADOOP_VERSION}-SNAPSHOT.jar

ENV MONGO_HADOOP_SPARK_PATH /usr/local/mongo-hadoop/spark
ENV MONGO_HADOOP_SPARK_JAR ${MONGO_HADOOP_SPARK_PATH}/build/libs/mongo-hadoop-spark-${MONGO_HADOOP_VERSION}-SNAPSHOT.jar
ENV PYTHONPATH  ${MONGO_HADOOP_SPARK_PATH}/src/main/python

ENV SPARK_DRIVER_EXTRA_CLASSPATH ${MONGO_HADOOP_JAR}:${MONGO_HADOOP_SPARK_JAR}
ENV CLASSPATH ${SPARK_DRIVER_EXTRA_CLASSPATH}
ENV JARS ${MONGO_HADOOP_JAR},${MONGO_HADOOP_SPARK_JAR}

ENV PYSPARK_DRIVER_PYTHON /usr/bin/ipython
ENV PATH $PATH:$SPARK_HOME/bin

# Download  Spark
RUN wget -qO - ${SPARK_URL} | tar -xz -C /usr/local/ \
    && cd /usr/local && ln -s ${SPARK_DIR} spark

RUN wget -qO - ${MONGO_HADOOP_URL} | tar -xz -C /usr/local/ \
    && mv /usr/local/mongo-hadoop-${MONGO_HADOOP_COMMIT} /usr/local/mongo-hadoop \
    && cd /usr/local/mongo-hadoop \
    && ./gradlew jar

RUN echo "spark.driver.extraClassPath   ${CLASSPATH}" > $SPARK_HOME/conf/spark-defaults.conf

CMD ["/bin/bash"]

Siguiente permite construir una imagen (también he llevado a Docker Hub así que usted puede simplemente docker pull zero323/mongo-spark):

docker build -t 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

Inicio PySpark shell pasar --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)]

Por favor, tenga en cuenta que mongo-hadoop parece cerrar la conexión después de la primera acción. Por lo que llamar por ejemplo rdd.count() después de la colecta, se produce una excepción.

Basados en los diferentes problemas a los que me he encontrado con la creación de esta imagen me inclino a creer que el paso mongo-hadoop-1.5.0-SNAPSHOT.jar y mongo-hadoop-spark-1.5.0-SNAPSHOT.jar tanto --jars y --driver-class-path es la única duro requisito.

Notas:

3voto

asaad Puntos 301

Puede intentar usar --package opción en vez de --jars ... en su chispa-enviar el comando:

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 tarros de Uber y necesitan más dependencias para descargarse antes de puede llegar a trabajar.

0voto

Yo estaba teniendo el mismo problema ayer. Fue capaz de solucionarlo mediante la colocación de 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 el $SPARK_CLASSPATH ).

Me avisas si eso ayuda.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X