importando pyspark em python shell

111

Esta é uma cópia da pergunta de outra pessoa em outro fórum que nunca foi respondida, então pensei em perguntar novamente aqui, pois tenho o mesmo problema. (Consulte http://geekple.com/blogs/feeds/Xgzu7/posts/351703064084736 )

Instalei o Spark corretamente em minha máquina e consigo executar programas python com os módulos pyspark sem erros ao usar ./bin/pyspark como meu interpretador python.

No entanto, quando tento executar o shell Python normal, quando tento importar módulos pyspark, recebo este erro:

from pyspark import SparkContext

e diz

"No module named pyspark".

Como posso consertar isso? Existe uma variável de ambiente que preciso definir para apontar o Python para os cabeçalhos / bibliotecas / etc. Do pyspark? Se minha instalação do Spark for / spark /, quais caminhos do pyspark devo incluir? Ou os programas pyspark só podem ser executados a partir do interpretador pyspark?

Glenn Strycker
fonte
Eles dizem que alterar as variáveis ​​de ambiente "não é muito eficaz, porque é substituído muito rapidamente por bin / spark-submit." Talvez você possa aprender algo com essa troca
emmagras

Respostas:

97

Aqui está um método simples (se você não se importar em como funciona !!!)

Use findpark

  1. Vá para o seu shell python

    pip install findspark
    
    import findspark
    findspark.init()
  2. importe os módulos necessários

    from pyspark import SparkContext
    from pyspark import SparkConf
  3. Feito!!!

Suresh2692
fonte
As outras soluções não funcionaram para mim. Estou usando o Findpark agora no meu programa. Parece uma solução decente para o problema.
Monge Analítico de
Eu prefiro não precisar fazer isso .. mas hey .. dado que nada mais funciona .. Vou aceitar.
javadba
51

Se imprimir esse erro:

ImportError: Nenhum módulo denominado py4j.java_gateway

Adicione $ 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
fonte
9
Conforme descrito em outra resposta stackoverflow.com/questions/26533169/… Tive que adicionar a seguinte exportação PYTHONPATH = $ SPARK_HOME / python / lib / py4j-0.8.2.1-src.zip: $ PYTHONPATH
meyerson
46

Acontece que o bin pyspark está CARREGANDO o python e carregando automaticamente os caminhos de biblioteca corretos. Confira $ SPARK_HOME / bin / pyspark:

# Add the PySpark classes to the Python path:
export PYTHONPATH=$SPARK_HOME/python/:$PYTHONPATH

Eu adicionei esta linha ao meu arquivo .bashrc e os módulos agora foram encontrados corretamente!

Glenn Strycker
fonte
1
Além dessa etapa, eu também precisava adicionar export SPARK_HOME=~/dev/spark-1.1.0:, vai entender. Seus nomes de pasta podem variar.
emmagras
21

não execute seu arquivo py como: em python filename.py vez disso, use:spark-submit filename.py

dodo
fonte
Alguém pode explicar por que não fazer isso? Estive examinando essa questão, mas até agora não consegui encontrar nenhuma que explicasse o porquê.
Mint
@Mint As outras respostas mostram por quê; o pacote pyspark não está incluído no $ PYTHONPATH por padrão, portanto, import pysparkhaverá falha na linha de comando ou em um script executado. Você tem que a. execute o pyspark através do spark-submit conforme pretendido ou b. adicione $ SPARK_HOME / python a $ PYTHONPATH.
Kingledion
Outro ponto é o spark-submit é um script de shell, que ajuda a configurar o ambiente do sistema corretamente antes de usar o spark, se você apenas fizer python main.py, será necessário configurar o ambiente do sistema corretamente, por exemplo, PYTHONPATH, SPARK_HOME
E.ZY.
21

Ao exportar o caminho SPARK e o caminho Py4j, começou 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

Então, se você não quiser digitá-los toda vez que quiser iniciar o shell Python, você pode querer adicioná-lo ao seu .bashrcarquivo

Dawny33
fonte
1
Não consigo encontrar o diretório libexec na minha Apache Sparkinstalação, alguma ideia?
Alberto Bonsanto
@AlbertoBonsanto Desculpe. Eu não enfrentei esse problema. Então, não faço ideia :(
Dawny33
1
Sim, eles retiraram a pasta libexec no spark 1.5.2
bluerubez
1
@bluerubez Parece estar lá no Spark 1.6.2 ... Além disso, não tenho certeza para que libexec/python/buildserve o diretório, mas o
Spark
17

No Mac, eu uso o Homebrew para instalar o Spark (fórmula "apache-spark"). Então, eu defino o PYTHONPATH desta forma para que a importação do 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

Substitua o "1.2.0" pela versão real do apache-spark no seu mac.

jyu
fonte
14

Para uma execução do Spark no pyspark, dois componentes são necessários para trabalhar juntos:

  • pyspark pacote python
  • Instância do Spark em uma JVM

Ao iniciar coisas com spark-submit ou pyspark, esses scripts cuidarão de ambos, ou seja, eles configuram seu PYTHONPATH, PATH, etc, para que seu script possa encontrar pyspark, e eles também iniciem a instância de spark, configurando de acordo com seus parâmetros , por exemplo --master X

Como alternativa, é possível ignorar esses scripts e executar seu aplicativo Spark diretamente no interpretador python python myscript.py. Isso é especialmente interessante quando os scripts do Spark começam a se tornar mais complexos e, eventualmente, recebem seus próprios argumentos.

  1. Certifique-se de que o pacote pyspark possa ser encontrado pelo interpretador Python. Conforme já discutido, adicione o dir spark / python ao PYTHONPATH ou instale diretamente o pyspark usando pip install.
  2. Defina os parâmetros da instância do spark a partir do seu script (aqueles que costumavam ser passados ​​para o pyspark).
    • Para configurações do Spark, como você normalmente definiria com --conf, elas são definidas com um objeto de configuração (ou configurações de string) em SparkSession.builder.config
    • Para opções principais (como --master ou --driver-mem) no momento, você pode defini-las escrevendo na variável de ambiente PYSPARK_SUBMIT_ARGS. Para tornar as coisas mais limpas e seguras, você pode configurá-lo dentro do próprio Python e o Spark irá lê-lo ao iniciar.
  3. Inicie a instância, que requer apenas que você chame a getOrCreate()partir do objeto construtor.

Portanto, seu script pode ter algo assim:

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
fonte
9

Para se livrar de ImportError: No module named py4j.java_gateway, você precisa adicionar as seguintes linhas:

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

No Windows 10, o seguinte funcionou para mim. Eu adicionei as seguintes variáveis ​​de ambiente usando Configurações > Editar variáveis ​​de ambiente para sua conta :

SPARK_HOME=C:\Programming\spark-2.0.1-bin-hadoop2.7
PYTHONPATH=%SPARK_HOME%\python;%PYTHONPATH%

(mude "C: \ Programming \ ..." para a pasta na qual você instalou o Spark)

JustAC0der
fonte
5

Para usuários do Linux, o seguinte é a maneira correta (e não codificada) de incluir o pyspark libaray em PYTHONPATH. Ambas as partes do PATH são necessárias:

  1. O caminho para o próprio módulo pyspark Python e
  2. O caminho para a biblioteca compactada da qual esse módulo pyspark depende quando importado

Observe abaixo que a versão da biblioteca compactada é determinada dinamicamente, portanto, não a codificamos permanentemente.

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

Estou executando um cluster Spark, no CentOS VM, que é instalado a partir de pacotes cloudera yum.

Tive que definir as seguintes variáveis ​​para executar o pyspark.

export SPARK_HOME=/usr/lib/spark;
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.9-src.zip:$PYTHONPATH
Sujesh Chirackkal
fonte
4
export PYSPARK_PYTHON=/home/user/anaconda3/bin/python
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS='notebook'

Isso é o que fiz para usar minha distribuição Anaconda com Spark. Esta é uma versão do Spark independente. Você pode alterar a primeira linha para o bin python de seus usuários. Além disso, a partir do Spark 2.2.0, o PySpark está disponível como um pacote autônomo no PyPi, mas ainda estou para testá-lo.

Yayati Sule
fonte
4

Você pode obter o pyspark pathem python usando pip(se você instalou o pyspark usando PIP) conforme abaixo

pip show pyspark
usuário3524049
fonte
3

Eu tive o mesmo problema.

Certifique-se também de que está usando a versão certa do Python e instalando com a versão certa do pip. no meu caso: eu tinha o python 2.7 e 3.x. Eu instalei o pyspark com

pip2.7 install pyspark

e funcionou.

etinika
fonte
2

Recebi este erro porque o script python que estava tentando enviar se chama pyspark.py ( facepalm ). A correção foi definir meu PYTHONPATH conforme recomendado acima, renomear o script para pyspark_test.py e limpar o pyspark.pyc que foi criado com base no nome original do meu script e que corrigiu o erro.

Patrick
fonte
2

No caso de DSE (DataStax Cassandra & Spark) O seguinte local precisa ser adicionado a PYTHONPATH

export PYTHONPATH=/usr/share/dse/resources/spark/python:$PYTHONPATH

Em seguida, use o dse pyspark para obter os módulos no caminho.

dse pyspark
Sreesankar
fonte
2

Eu tive esse mesmo problema e acrescentaria algo às soluções propostas acima. Ao usar o Homebrew no Mac OS X para instalar o Spark, você precisará corrigir o endereço do caminho py4j para incluir libexec no caminho (lembrando de alterar a versão py4j para a que você tem);

PYTHONPATH=$SPARK_HOME/libexec/python/lib/py4j-0.9-src.zip:$PYTHONPATH
tjb305
fonte
Observação - tentei descompactá-lo e usar py4japenas a pasta, não funcionou. Use o arquivo zip ...
El Dude
2

No meu caso, ele estava sendo instalado em um dist_package diferente do python (python 3.5), enquanto eu estava usando o python 3.6, então o seguinte ajudou:

python -m pip install pyspark
D intocável
fonte
1

Você também pode criar um contêiner Docker com Alpine como sistema operacional e instalar Python e Pyspark como pacotes. Isso terá tudo em contêiner.

Eddy
fonte