importando pyspark en python shell

111

Esta es una copia de la pregunta de otra persona en otro foro que nunca fue respondida, así que pensé en volver a hacerla 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 errores al usar ./bin/pyspark como mi intérprete de Python.

Sin embargo, cuando intento ejecutar el shell Python normal, cuando intento importar módulos pyspark, aparece este error:

from pyspark import SparkContext

y dice

"No module named pyspark".

¿Cómo puedo arreglar esto? ¿Hay alguna variable de entorno que deba configurar para apuntar a Python a los encabezados / bibliotecas / etc. de pyspark? Si mi instalación de Spark es / spark /, ¿qué rutas de pyspark debo incluir? ¿O los programas pyspark solo se pueden ejecutar desde el intérprete de pyspark?

Glenn Strycker
fuente
Dicen que cambiar las variables de entorno "no es muy efectivo, porque bin / spark-submit lo anula muy rápidamente". Tal vez puedas aprender algo de este intercambio
emmagras

Respuestas:

97

Aquí hay un método simple (¡si no te preocupas por cómo funciona!)

Utilice findpark

  1. Ve a tu caparazón de Python

    pip install findspark
    
    import findspark
    findspark.init()
  2. importar los módulos necesarios

    from pyspark import SparkContext
    from pyspark import SparkConf
  3. ¡¡¡Hecho!!!

Suresh2692
fuente
Las otras soluciones no funcionaron para mí. Estoy usando findpark por ahora en mi programa. Parece una solución decente al problema.
Monje analítico
Preferiría no tener que hacer esto ... pero bueno ... dado que nada más funciona ... lo tomaré.
javadba
51

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
Peng Zhang 1516540
fuente
9
Como se describe en otra respuesta stackoverflow.com/questions/26533169/… Tuve que agregar la siguiente exportación PYTHONPATH = $ SPARK_HOME / python / lib / py4j-0.8.2.1-src.zip: $ PYTHONPATH
meyerson
46

Resulta que pyspark bin está CARGANDO python y cargando automáticamente las rutas correctas de la biblioteca. Echa un vistazo a $ 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 los módulos ahora se encuentran correctamente!

Glenn Strycker
fuente
1
Además de este paso, también necesitaba agregar:, export SPARK_HOME=~/dev/spark-1.1.0imagínate. Los nombres de sus carpetas pueden variar.
emmagras
21

no ejecute su archivo py como: python filename.py en su lugar use:spark-submit filename.py

vejestorio
fuente
¿Alguien puede explicar por qué no hacer esto? He estado investigando esta pregunta, pero hasta ahora no he podido encontrar ninguna que explique por qué es así.
Mint
@Mint Las otras respuestas muestran por qué; el paquete pyspark no está incluido en $ PYTHONPATH por defecto, por import pysparklo que fallará en la línea de comando o en un script ejecutado. Tienes que a. ejecute pyspark a través de spark-submit según lo previsto o b. agregue $ SPARK_HOME / python a $ PYTHONPATH.
kingledion
Otro punto es spark-submit es un script de shell, que lo ayuda a configurar el entorno del sistema correctamente antes de usar Spark, si solo usa python main.py, necesita configurar el entorno del sistema correctamente, por ejemplo, PYTHONPATH, SPARK_HOME
E.ZY.
21

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 escribirlos cada vez que desee iniciar el shell de Python, es posible que desee agregarlo a su .bashrcarchivo

Dawny33
fuente
1
No puedo encontrar el directorio libexec en mi Apache Sparkinstalación, ¿alguna idea?
Alberto Bonsanto
@AlbertoBonsanto Lo siento. No me he enfrentado a este problema. Entonces, no
tengo
1
Sí, sacaron la carpeta libexec en
Spark
1
@bluerubez Parece estar allí en Spark 1.6.2 ... Además, no estoy seguro de para qué libexec/python/buildsirve el directorio, pero Spark 1.6.2 no lo tiene
OneCricketeer
17

En Mac, uso Homebrew para instalar Spark (fórmula "apache-spark"). Luego, configuro PYTHONPATH de esta manera para que la importación de Python funcione:

export SPARK_HOME=/usr/local/Cellar/apache-spark/1.2.0
export PYTHONPATH=$SPARK_HOME/libexec/python:$SPARK_HOME/libexec/python/build:$PYTHONPATH

Reemplace "1.2.0" con la versión actual de apache-spark en su mac.

jyu
fuente
14

Para una ejecución de Spark en pyspark, se requieren dos componentes para trabajar juntos:

  • pyspark paquete python
  • Instancia de Spark en una JVM

Al iniciar cosas con spark-submit o pyspark, estos scripts se encargarán de ambos, es decir, configuran su PYTHONPATH, PATH, etc., para que su script pueda encontrar pyspark, y también inician la instancia de Spark, configurándose de acuerdo con sus parámetros. , por ejemplo, maestro X

Alternativamente, es posible omitir estos scripts y ejecutar su aplicación Spark directamente en el intérprete de Python como python myscript.py. Esto es especialmente interesante cuando los scripts de chispa comienzan a volverse más complejos y eventualmente reciben sus propios argumentos.

  1. Asegúrese de que el intérprete de Python pueda encontrar el paquete pyspark. Como ya se mencionó, agregue el directorio spark / python a PYTHONPATH o instale directamente pyspark usando pip install.
  2. Establezca los parámetros de la instancia de Spark desde su script (los que solían pasarse a pyspark).
    • Para configuraciones de chispa, como normalmente establecería 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 en la variable de entorno PYSPARK_SUBMIT_ARGS. Para hacer las cosas más limpias y seguras, puede configurarlo desde el propio Python, y Spark lo leerá al iniciar.
  3. Inicie la instancia, que solo requiere que llame getOrCreate()desde el objeto constructor.

Por lo tanto, su secuencia de comandos 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())
F Pereira
fuente
9

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)
Karang
fuente
7

En Windows 10, lo siguiente funcionó para mí. Agregué las siguientes variables de entorno usando Configuración > 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 Spark)

JustAC0der
fuente
5

Para los usuarios de Linux, la siguiente es la forma correcta (y no codificada) de incluir la biblioteca pyspark en PYTHONPATH. Ambas partes de PATH son necesarias:

  1. La ruta al módulo pyspark Python en sí, y
  2. La ruta a la biblioteca comprimida en la que se basa ese módulo pyspark cuando se importa

Observe a continuación que la versión de la biblioteca comprimida se determina dinámicamente, por lo que no la codificamos.

export PYTHONPATH=${SPARK_HOME}/python/:$(echo ${SPARK_HOME}/python/lib/py4j-*-src.zip):${PYTHONPATH}
NYCeyes
fuente
4

Estoy ejecutando un clúster de chispa, en CentOS VM, que se instala desde los paquetes de cloudera yum.

Tuve que configurar 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
sujesh chirackkal
fuente
4
export PYSPARK_PYTHON=/home/user/anaconda3/bin/python
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS='notebook'

Esto es lo que hice para usar mi distribución de Anaconda con Spark. Esta es la versión Spark independiente. Puede cambiar la primera línea al contenedor de Python de sus usuarios. Además, a partir de Spark 2.2.0, PySpark está disponible como paquete independiente en PyPi, pero todavía tengo que probarlo.

Yayati Sule
fuente
4

Puede obtener el pyspark pathen python usando pip(si ha instalado pyspark usando PIP) como se muestra a continuación

pip show pyspark
usuario3524049
fuente
3

Yo tuve el mismo problema.

También asegúrese de que está utilizando la versión correcta de Python y que la está instalando con la versión correcta de pip. en mi caso: tenía python 2.7 y 3.x. He instalado pyspark con

pip2.7 instalar pyspark

Y funcionó.

etinika
fuente
2

Recibí este error porque el script de Python que estaba intentando enviar se llamaba pyspark.py ( facepalm ). La solución fue configurar mi PYTHONPATH como se recomendó anteriormente, luego cambiar el nombre de la secuencia de comandos a pyspark_test.py y limpiar el pyspark.pyc que se creó en función del nombre original de mi secuencia de comandos y que borró este error.

Patricio
fuente
2

En el caso de DSE (DataStax Cassandra & Spark) Es necesario 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
Sreesankar
fuente
2

Tuve este mismo problema y agregaría una cosa a las soluciones propuestas anteriormente. Cuando use Homebrew en Mac OS X para instalar Spark, deberá corregir la dirección de la ruta de py4j para incluir libexec en la ruta (recuerde cambiar la versión de py4j por la que tiene);

PYTHONPATH=$SPARK_HOME/libexec/python/lib/py4j-0.9-src.zip:$PYTHONPATH
tjb305
fuente
Nota: intenté descomprimirlo y usar py4jsolo la carpeta, no funcionó. Use el archivo zip ...
El Dude
2

En mi caso, se estaba instalando en un dist_package de python diferente (python 3.5) mientras que yo estaba usando python 3.6, por lo que lo siguiente ayudó:

python -m pip install pyspark
D intocable
fuente
1

También puede crear un contenedor Docker con Alpine como sistema operativo e instalar Python y Pyspark como paquetes. Eso lo tendrá todo en contenedores.

Remolino
fuente