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
yPYSPARK_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