findspark python
ImportaciĆ³n de pyspark en shell python (16)
Esta es una copia de la pregunta de otra persona en otro foro que nunca fue respondida, así que pensé en volver a preguntar aquí, ya que tengo el mismo problema. (Ver http://geekple.com/blogs/feeds/Xgzu7/posts/351703064084736 )
Tengo Spark instalado correctamente en mi máquina y puedo ejecutar programas de Python con los módulos de pyspark sin error cuando uso ./bin/pyspark como mi intérprete de Python.
Sin embargo, cuando intento ejecutar el shell de Python normal, cuando intento importar módulos de pyspark obtengo este error:
from pyspark import SparkContext
y dice
"No module named pyspark".
¿Cómo puedo arreglar esto? ¿Hay alguna variable de entorno que deba establecer para apuntar Python a los encabezados / bibliotecas / pyspark / etc.? Si mi instalación de chispa es / spark /, ¿qué rutas de Pyspark necesito incluir? ¿O pueden los programas de pyspark solo ejecutarse desde el intérprete de pyspark?
Al exportar la ruta SPARK y la ruta Py4j, comenzó a funcionar:
export SPARK_HOME=/usr/local/Cellar/apache-spark/1.5.1
export PYTHONPATH=$SPARK_HOME/libexec/python:$SPARK_HOME/libexec/python/build:$PYTHONPATH
PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.8.2.1-src.zip:$PYTHONPATH
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/build:$PYTHONPATH
Por lo tanto, si no desea escribir estos cada vez que desea iniciar el shell de Python, es posible que desee agregarlo a su archivo .bashrc
Aquí hay un método simple (¡Si no te molesta cómo funciona!)
Usa el findspark
Ve a tu caparazón de pitón
pip install findspark import findspark findspark.init()
importar los módulos necesarios
from pyspark import SparkContext from pyspark import SparkConf
¡¡¡Hecho!!!
En Mac, uso Homebrew para instalar Spark (fórmula "apache-spark"). Luego, configuro PYTHONPATH de esta manera para que funcione la importación de Python:
export SPARK_HOME=/usr/local/Cellar/apache-spark/1.2.0
export PYTHONPATH=$SPARK_HOME/libexec/python:$SPARK_HOME/libexec/python/build:$PYTHONPATH
Reemplace el "1.2.0" con la versión actual apache-spark en su mac.
En Windows 10, lo siguiente funcionó para mí. Agregué las siguientes variables de entorno usando Configuraciones > Editar variables de entorno para su cuenta :
SPARK_HOME=C:/Programming/spark-2.0.1-bin-hadoop2.7
PYTHONPATH=%SPARK_HOME%/python;%PYTHONPATH%
(cambie "C: / Programming / ..." a la carpeta en la que ha instalado la chispa)
En el caso de DSE (DataStax Cassandra & Spark), se debe agregar la siguiente ubicación a PYTHONPATH
export PYTHONPATH=/usr/share/dse/resources/spark/python:$PYTHONPATH
Luego use dse pyspark para obtener los módulos en la ruta.
dse pyspark
Estoy ejecutando un clúster de chispa en CentOS VM, que se instala desde los paquetes cloudera yum.
Tuvo que establecer las siguientes variables para ejecutar pyspark.
export SPARK_HOME=/usr/lib/spark;
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.9-src.zip:$PYTHONPATH
No ejecute su archivo py como: python filename.py
en su lugar use: spark-submit filename.py
Obtuve este error porque el script de Python que estaba tratando de enviar se llamaba pyspark.py ( facepalm ). La solución fue establecer mi PYTHONPATH como se recomienda arriba, luego cambiar el nombre del script a pyspark_test.py y limpiar el pyspark.pyc que se creó en base al nombre original de mi scripts y que borró este error.
Para deshacerse de ImportError: No module named py4j.java_gateway
, debe agregar las siguientes líneas:
import os
import sys
os.environ[''SPARK_HOME''] = "D:/python/spark-1.4.1-bin-hadoop2.4"
sys.path.append("D:/python/spark-1.4.1-bin-hadoop2.4/python")
sys.path.append("D:/python/spark-1.4.1-bin-hadoop2.4/python/lib/py4j-0.8.2.1-src.zip")
try:
from pyspark import SparkContext
from pyspark import SparkConf
print ("success")
except ImportError as e:
print ("error importing spark modules", e)
sys.exit(1)
Para una ejecución Spark en pyspark se requieren dos componentes para trabajar juntos:
- paquete
pyspark
python - Instancia de chispa en una JVM
Al lanzar cosas con spark-submit o pyspark, estos scripts se encargarán de ambos, es decir, configurarán su PYTHONPATH, PATH, etc., para que su script pueda encontrar pyspark, y también comiencen la instancia de chispa, configurándose de acuerdo con sus params. , por ejemplo, --master X
Alternativamente, es posible omitir estos scripts y ejecutar su aplicación de chispa directamente en el intérprete de python myscript.py
como python myscript.py
. Esto es especialmente interesante cuando los scripts de chispa comienzan a ser más complejos y eventualmente reciben sus propios argumentos.
- Asegúrese de que el intérprete de Python pueda encontrar el paquete pyspark. Como ya se discutió, agregue el directorio spark / python a PYTHONPATH o directamente instale pyspark usando pip install.
- Establezca los parámetros de instancia de chispa de su secuencia de comandos (los que solían pasar a pyspark).
- Para las configuraciones de chispa que normalmente se configuran con --conf se definen con un objeto de configuración (o configuraciones de cadena) en SparkSession.builder.config
- Para las opciones principales (como --master, o --driver-mem) por el momento puede configurarlas escribiendo a la variable de entorno PYSPARK_SUBMIT_ARGS. Para hacer que las cosas estén más limpias y seguras, puedes configurarlas desde dentro de Python, y la chispa lo leerá al comenzar.
- Inicie la instancia, que solo requiere que llame a
getOrCreate()
desde el objeto del generador.
Tu script puede tener algo como esto:
from pyspark.sql import SparkSession
if __name__ == "__main__":
if spark_main_opts:
# Set main options, e.g. "--master local[4]"
os.environ[''PYSPARK_SUBMIT_ARGS''] = spark_main_opts + " pyspark-shell"
# Set spark config
spark = (SparkSession.builder
.config("spark.checkpoint.compress", True)
.config("spark.jars.packages", "graphframes:graphframes:0.5.0-spark2.1-s_2.11")
.getOrCreate())
Para usuarios de Linux, la siguiente es la forma correcta (y no codificada) de incluir el pyspark libaray en PYTHONPATH. Ambas partes de PATH son necesarias:
- La ruta al módulo pyspark Python en sí, y
- La ruta a la biblioteca comprimida en la que se basa ese módulo de pyspark cuando se importa
Observe a continuación que la versión comprimida de la biblioteca está determinada dinámicamente, por lo que no la codificamos.
export PYTHONPATH=${SPARK_HOME}/python/:$(echo ${SPARK_HOME}/python/lib/py4j-*-src.zip):${PYTHONPATH}
Resulta que el contenedor de pyspark está CARGANDO python y cargando automáticamente las rutas correctas de la biblioteca. Consulte $ SPARK_HOME / bin / pyspark:
# Add the PySpark classes to the Python path:
export PYTHONPATH=$SPARK_HOME/python/:$PYTHONPATH
¡Agregué esta línea a mi archivo .bashrc y ahora los módulos se encuentran correctamente!
Si imprime tal error:
ImportError: ningún módulo llamado py4j.java_gateway
Agregue $ SPARK_HOME / python / build a PYTHONPATH:
export SPARK_HOME=/Users/pzhang/apps/spark-1.1.0-bin-hadoop2.4
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/build:$PYTHONPATH
Tuve el mismo problema y agregaría una cosa a las soluciones propuestas anteriormente. Cuando utilice Homebrew en Mac OS X para instalar Spark, deberá corregir la dirección de la ruta py4j para incluir libexec en la ruta (recordando cambiar la versión de py4j por la que tiene);
PYTHONPATH=$SPARK_HOME/libexec/python/lib/py4j-0.9-src.zip:$PYTHONPATH
Yo tuve el mismo problema.
También asegúrese de estar utilizando la versión de python correcta y la está instalando con la versión de pip correcta. en mi caso: tenía tanto Python 2.7 como 3.x. He instalado pyspark con
pip2.7 install pyspark
Y funcionó.
export PYSPARK_PYTHON=/home/user/anaconda3/bin/python
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS=''notebook''
Esto es lo que hice al usar mi distribución de Anaconda con Spark. Esta es la versión Spark independiente. Puedes cambiar la primera línea a la bandeja de pitones de tus usuarios. Además, a partir de Spark 2.2.0, PySpark está disponible como paquete independiente en PyPi, pero todavía no lo he probado.