Py4JJava Error al probar Pyspark en Jupyter notebook en una sola máquina

Soy nuevo en Spark y recientemente lo instalé en un mac (con Python 2.7 en el sistema) usando homebrew:

brew install apache-spark

y luego instalado Pyspark usando pip3 en mi entorno virtual donde tengo python 3.6 instalado.

/Users/xxx/venv/bin/python /Users/xxx/venv/bin/pip3 install pyspark

Cuando corrí el código de abajo en mi Jupyter Notebook para probar si Spark funciona en una sola máquina:

from pyspark.context import SparkContext
sc = SparkContext.getOrCreate()

import random
num_samples = 100000000

def inside(p):     
    x, y = random.random(), random.random()
    return x*x + y*y < 1

count = sc.parallelize(range(0, num_samples)).filter(inside).count()

pi = 4 * count / num_samples
print(pi)

sc.stop()

Me encontré con el siguiente error con sc.parallelize:

Py4JJavaError                             Traceback (most recent call last)
 in 
      8     return x*x + y*y < 1
      9 
---> 10 count = sc.parallelize(range(0, num_samples)).filter(inside).count()
     11 
     12 pi = 4 * count / num_samples
~/venv/deep_learning/lib/python3.6/site-packages/pyspark/rdd.py in count(self)
   1139         3
   1140         """
-> 1141         return self.mapPartitions(lambda i: [sum(1 for _ in i)]).sum()
   1142 
   1143     def stats(self):

~/venv/deep_learning/lib/python3.6/site-packages/pyspark/rdd.py in sum(self)
   1130         6.0
   1131         """
-> 1132         return self.mapPartitions(lambda x: [sum(x)]).fold(0, operator.add)
   1133 
   1134     def count(self):

~/venv/deep_learning/lib/python3.6/site-packages/pyspark/rdd.py in fold(self, zeroValue, op)
   1001         # zeroValue provided to each partition is unique from the one provided
   1002         # to the final reduce call
-> 1003         vals = self.mapPartitions(func).collect()
   1004         return reduce(op, vals, zeroValue)
   1005 

~/venv/deep_learning/lib/python3.6/site-packages/pyspark/rdd.py in collect(self)
    887         
    888         with SCCallSiteSync(self.context) as css:
-> 889             sock_info = self.ctx._jvm.PythonRDD.collectAndServe(self._jrdd.rdd())
    890         return list(_load_from_socket(sock_info, self._jrdd_deserializer))
    891 

~/venv/deep_learning/lib/python3.6/site-packages/py4j/java_gateway.py in __call__(self, *args)
   1303         answer = self.gateway_client.send_command(command)
   1304         return_value = get_return_value(
-> 1305             answer, self.gateway_client, self.target_id, self.name)
   1306 
   1307         for temp_arg in temp_args:

~/venv/deep_learning/lib/python3.6/site-packages/py4j/protocol.py in get_return_value(answer, gateway_client, target_id, name)
    326                 raise Py4JJavaError(
    327                     "An error occurred while calling {0}{1}{2}.\n".
-> 328                     format(target_id, ".", name), value)
    329             else:
    330                 raise Py4JError(

Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 2 in stage 0.0 failed 1 times, most recent failure: Lost task 2.0 in stage 0.0 (TID 2, 192.168.0.15, executor driver): org.apache.spark.api.python.PythonException: Traceback (most recent call last):

  File "/Users/xxx/venv/deep_learning/lib/python3.6/site-packages/pyspark/python/lib/pyspark.zip/pyspark/worker.py", line 477, in main
    ("%d.%d" % sys.version_info[:2], version))

Exception: Python in worker has different version 2.7 than that in driver 3.6, PySpark cannot run with different minor versions. Please check environment variables PYSPARK_PYTHON and PYSPARK_DRIVER_PYTHON are correctly set.

He configurado la ruta Pyspark como sigue en el /.bash_profile:

export SPARK_HOME=/usr/local/Cellar/apache-spark/3.0.1/libexec
export PYTHONPATH=/usr/local/Cellar/apache-spark/3.0.1/libexec/python/:$PYTHONP$
export PYSPARK_PYTHON=/Users/xxx/venv/bin/python
export PYSPARK_DRIVER_PYTHON=/Users/xxx/venv/bin/python

¿Alguien sabe lo que hice mal aquí? Cualquier consejo será muy apreciado.

Pregunta hecha hace 3 años, 4 meses, 25 días - Por binarybrainiac


3 Respuestas:

  • Parece que este problema está relacionado específicamente con Pyspark. El problema se puede resolver utilizando el paquete findspark. A continuación se muestra la cita del Encontrarspark readme file:

    PySpark no está en sys.path por defecto, pero eso no significa que no se puede utilizar como biblioteca regular. Puede dirigirse a esto ya sea simpatizando pyspark en sus paquetes de sitio, o añadiendo pyspark a sys.path en tiempo de ejecución. Hallspark lo hace.

    Agregar el código abajo antes de iniciar SparkContext resuelve el problema:

    import findspark
    findspark.init()
    

    Respondida el Dec 20, 2020 a las 22:51 - por progprophet

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando se debe a que estás utilizando Python 3.6 en tu Jupyter Notebook, pero PySpark está intentando ejecutarse con Python 2.7 en los workers de Spark. Esto suele ocurrir si las variables de entorno PYSPARKPYTHON y PYSPARKDRIVER_PYTHON no se configuran correctamente para que coincidan con la versión de Python que estás utilizando.

    Dados los ajustes que has realizado en tu archivo .bash_profile, parece que has establecido las variables de entorno correctamente con Python 3.6, por lo que es extraño que aún enfrentes el problema.

    Aquí hay algunas sugerencias para intentar solucionar el problema:

    • Reinicia el Kernel: En tu Jupyter Notebook, intenta reiniciar el Kernel para asegurarte de que se lean las variables de entorno actualizadas.
    • Abre un nuevo terminal: Después de modificar tu `.bash_profile`, asegúrate de abrir un nuevo terminal y ejecutar Jupyter Notebook desde este terminal para que las variables de entorno se carguen correctamente.
    • Verifica las variables de entorno: Puedes verificar las variables de entorno desde tu notebook ejecutando el siguiente código:
    python
    import os
    print(os.environ['PYSPARK_PYTHON'])
    print(os.environ['PYSPARK_DRIVER_PYTHON'])
    

    Asegúrate de que los resultados sean las rutas correctas a tus binarios de Python 3.6.

    • Vuelve a revisar la configuración de PySpark: Dependiendo de cómo hayas configurado Spark en tu máquina, podría haber otras ubicaciones donde las variables de entorno PYSPARK_PYTHON y PYSPARK_DRIVER_PYTHON también estén siendo configuradas. Asegúrate de revisar todos los posibles archivos de configuración donde estas variables se puedan estar seteando.

    Si después de revisar estos puntos sigues teniendo problemas, puedes intentar realizar la configuración directamente en tu Jupyter Notebook antes de crear el SparkContext. Aquí hay un ejemplo de cómo hacerlo:

    python
    import os
    os.environ['PYSPARK_PYTHON'] = '/Users/xxx/venv/bin/python'
    os.environ['PYSPARK_DRIVER_PYTHON'] = '/Users/xxx/venv/bin/python'
    
    from pyspark.context import SparkContext
    sc = SparkContext.getOrCreate()
    

    Espero que estas sugerencias te ayuden a solucionar el problema que estás experimentando. ¡Déjame saber si necesitas más ayuda!

    Respondida el Dec 21, 2020 a las 22:49 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando es causado por una incompatibilidad de versiones entre Python en el controlador y en el trabajador. Spark no puede ejecutarse con diferentes versiones menores de Python, por lo que debes asegurarte de que las versiones de Python en el controlador y el trabajador coincidan.

    En tu configuración, has establecido las variables de entorno PYSPARK_PYTHON y PYSPARK_DRIVER_PYTHON para apuntar a la misma versión de Python (3.6) que estás utilizando en tu Jupyter Notebook. Sin embargo, el error indica que Python en el trabajador es la versión 2.7, que no coincide con la versión 3.6 en el controlador.

    Para solucionar este problema, verifica lo siguiente:

    • Asegúrate de que la versión de Python en `/usr/local/Cellar/apache-spark/3.0.1/libexec/python` sea 3.6. Puedes ejecutar el comando `python --version` en esa ubicación para verificar.
    • Si la versión de Python en esa ubicación no es 3.6, intenta reinstalar PySpark con la versión correcta de Python ejecutando el siguiente comando en tu entorno virtual:
    
    /Users/xxx/venv/bin/python3 /Users/xxx/venv/bin/pip3 install --upgrade pyspark==3.0.1
    
    • Reinicia el kernel de Jupyter Notebook y vuelve a ejecutar tu código.

    Si sigues teniendo problemas, puedes intentar lo siguiente:

    Desinstalar y reinstalar Spark y PySpark. Verificar los permisos de los archivos y directorios relacionados con Spark.

    • Consultar los registros de Spark para obtener más información sobre el error.

    Espero que esto ayude. Avísame si tienes más preguntas.

    Respondida el Dec 21, 2020 a las 22:54 - por Gemini

    Votos positivos: 0 | Votos negativos: 0