importowanie pyspark w powłoce Pythona


111

To jest kopia czyjegoś pytania na innym forum, na które nigdy nie udzielono odpowiedzi, więc pomyślałem, że zadam je tutaj ponownie, ponieważ mam ten sam problem. (Zobacz http://geekple.com/blogs/feeds/Xgzu7/posts/351703064084736 )

Mam poprawnie zainstalowanego Spark'a na moim komputerze i jestem w stanie uruchamiać programy w Pythonie z modułami pyspark bez błędów podczas używania ./bin/pyspark jako mojego interpretera Pythona.

Jednak gdy próbuję uruchomić zwykłą powłokę Pythona, kiedy próbuję zaimportować moduły pyspark, pojawia się ten błąd:

from pyspark import SparkContext

i mówi

"No module named pyspark".

Jak mogę to naprawić? Czy istnieje zmienna środowiskowa, którą muszę ustawić, aby wskazać Pythonowi nagłówki / biblioteki / itp.? Jeśli moja instalacja iskrowa to / spark /, które ścieżki pysparka muszę dołączyć? A może programy pyspark mogą być uruchamiane tylko z interpretera pyspark?


Mówią, że zmiana zmiennych środowiskowych „nie jest super efektywna, ponieważ jest bardzo szybko zastępowana przez bin / spark-submit”. Może dowiesz się czegoś z tej wymiany
emmagras

Odpowiedzi:


97

Oto prosta metoda (jeśli nie przejmujesz się tym, jak to działa !!!)

Użyj findspark

  1. Przejdź do powłoki Pythona

    pip install findspark
    
    import findspark
    findspark.init()
  2. zaimportuj niezbędne moduły

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


Inne rozwiązania nie działały u mnie. Na razie używam findspark w moim programie. Wydaje się, że jest to przyzwoite obejście problemu.
Analytical Monk

Wolałabym nie potrzebować tego robić… ale hej … ponieważ nic innego nie działa … wezmę to.
javadba

51

Jeśli wypisze taki błąd:

ImportError: Brak modułu o nazwie py4j.java_gateway

Dodaj $ SPARK_HOME / python / build do PYTHONPATH:

export SPARK_HOME=/Users/pzhang/apps/spark-1.1.0-bin-hadoop2.4
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/build:$PYTHONPATH

9
Jak opisano w innej odpowiedzi stackoverflow.com/questions/26533169/ ... musiałem dodać następujący eksport PYTHONPATH = $ SPARK_HOME / python / lib / py4j-0.8.2.1-src.zip: $ PYTHONPATH
meyerson

46

Okazuje się, że bin pyspark ŁADUJE pythona i automatycznie ładuje prawidłowe ścieżki bibliotek. Sprawdź $ SPARK_HOME / bin / pyspark:

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

Dodałem tę linię do mojego pliku .bashrc i moduły są teraz poprawnie znalezione!


1
Oprócz tego kroku musiałem również dodać: export SPARK_HOME=~/dev/spark-1.1.0idź rysunek. Twoje nazwy folderów mogą się różnić.
emmagras

21

nie uruchamiaj swojego pliku py jako: python filename.py zamiast tego użyj:spark-submit filename.py


Czy ktoś może rozwinąć, dlaczego tego nie zrobić? Przyglądałem się temu pytaniu, ale jak dotąd nie udało mi się znaleźć żadnego, które wyjaśniałoby, dlaczego tak jest.
Mint

@Mint Pozostałe odpowiedzi pokazują, dlaczego; pakiet pyspark nie jest domyślnie zawarty w $ PYTHONPATH, więc import pysparknie powiedzie się w linii poleceń lub w wykonywanym skrypcie. Musisz albo. uruchomić pyspark przez spark-submit zgodnie z przeznaczeniem lub b. dodaj $ SPARK_HOME / python do $ PYTHONPATH.
kingledion

Kolejnym punktem jest spark-submit to skrypt powłoki, który pomaga poprawnie skonfigurować środowisko systemowe przed użyciem sparka, jeśli robisz tylko python main.py musisz poprawnie skonfigurować środowisko systemowe np. PYTHONPATH, SPARK_HOME
E.ZY.

21

Po wyeksportowaniu ścieżki SPARK i ścieżki Py4j zaczęło działać:

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

Jeśli więc nie chcesz ich wpisywać za każdym razem, gdy chcesz uruchomić powłokę Pythona, możesz dodać ją do swojego .bashrcpliku


1
Nie mogę znaleźć katalogu libexec w mojej Apache Sparkinstalacji, masz jakiś pomysł?
Alberto Bonsanto

@AlbertoBonsanto Przepraszamy. Nie spotkałem się z tym problemem. Więc nie mam pojęcia :(
Dawny33,

1
Tak, wyjęli folder libexec w Spark 1.5.2
bluerubez

1
@bluerubez Wydaje się, że jest tam w Spark 1.6.2 ... Poza tym nie jestem pewien, do czego libexec/python/buildsłuży katalog, ale Spark 1.6.2 tego nie ma
OneCricketeer

17

Na Macu używam Homebrew do zainstalowania Sparka (formuła „apache-spark”). Następnie ustawiam PYTHONPATH w ten sposób, aby import Pythona działał:

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

Zastąp wersję „1.2.0” aktualną wersją Apache-Spark na komputerze Mac.


14

Do wykonania Sparka w pyspark wymagane są dwa komponenty do współpracy:

  • pyspark pakiet python
  • Wystąpienie Spark w JVM

Podczas uruchamiania rzeczy za pomocą spark-submit lub pyspark, te skrypty zajmą się obydwoma, tj. Skonfigurują PYTHONPATH, PATH itp., Aby twój skrypt mógł znaleźć pyspark, a także uruchomią instancję spark, konfigurując zgodnie z twoimi parametrami , np. --master X

Alternatywnie można ominąć te skrypty i uruchomić aplikację Spark bezpośrednio w interpreterze języka Python, takim jak python myscript.py. Jest to szczególnie interesujące, gdy skrypty iskier stają się bardziej złożone i ostatecznie otrzymują własne argumenty.

  1. Upewnij się, że pakiet pyspark można znaleźć przez interpreter języka Python. Jak już wspomniano, dodaj katalog spark / python do PYTHONPATH lub zainstaluj pyspark bezpośrednio za pomocą pip install.
  2. Ustaw parametry instancji Spark ze swojego skryptu (te, które były przekazywane do pyspark).
    • W przypadku konfiguracji Spark, jak zwykle ustawia się za pomocą --conf, są one zdefiniowane za pomocą obiektu konfiguracyjnego (lub konfiguracji ciągu) w SparkSession.builder.config
    • W przypadku głównych opcji (takich jak --master lub --driver-mem) w tej chwili możesz je ustawić, pisząc do zmiennej środowiskowej PYSPARK_SUBMIT_ARGS. Aby uczynić wszystko czystszym i bezpieczniejszym, możesz ustawić go z poziomu samego Pythona, a Spark odczyta go podczas uruchamiania.
  3. Uruchom instancję, która wymaga tylko wywołania getOrCreate()z obiektu budującego.

Twój skrypt może zatem mieć coś takiego:

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())

9

Aby się go pozbyć ImportError: No module named py4j.java_gateway, musisz dodać następujące wiersze:

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)

7

W systemie Windows 10 działały u mnie następujące rozwiązania. Dodałem następujące zmienne środowiskowe za pomocą opcji Ustawienia > Edytuj zmienne środowiskowe dla Twojego konta :

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

(zmień „C: \ Programming \ ...” na folder, w którym zainstalowałeś Spark)


5

Dla użytkowników Linuksa prawidłowy (i nie zakodowany na stałe) sposób włączenia pyspark libaray do PYTHONPATH. Potrzebne są obie części PATH:

  1. Ścieżka do samego modułu pyspark Python i
  2. Ścieżka do spakowanej biblioteki, na której opiera się ten moduł pyspark podczas importowania

Zauważ poniżej, że wersja spakowanej biblioteki jest określana dynamicznie, więc nie kodujemy jej na stałe.

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

4

Używam klastra Spark na CentOS VM, który jest instalowany z pakietów cloudera yum.

Musiał ustawić następujące zmienne, aby uruchomić pyspark.

export SPARK_HOME=/usr/lib/spark;
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.9-src.zip:$PYTHONPATH

4
export PYSPARK_PYTHON=/home/user/anaconda3/bin/python
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS='notebook'

Oto, co zrobiłem, używając mojej dystrybucji Anaconda ze Sparkiem. To jest niezależna od wersji Spark. Możesz zmienić pierwszą linię do bin pythona użytkowników. Ponadto od Spark 2.2.0 PySpark jest dostępny jako samodzielny pakiet na PyPi, ale jeszcze go nie przetestowałem.


4

Możesz pobrać pyspark pathw Pythonie używając pip(jeśli zainstalowałeś pyspark używając PIP) jak poniżej

pip show pyspark

3

Miałem ten sam problem.

Upewnij się również, że używasz odpowiedniej wersji Pythona i instalujesz ją z odpowiednią wersją pip. w moim przypadku: miałem zarówno Pythona 2.7, jak i 3.x. Zainstalowałem pyspark z

pip2.7 zainstaluj pyspark

i zadziałało.


2

Otrzymałem ten błąd, ponieważ skrypt Pythona, który próbowałem przesłać, miał nazwę pyspark.py ( facepalm ). Poprawka polegała na ustawieniu mojej PYTHONPATH zgodnie z powyższymi zaleceniami, a następnie zmianie nazwy skryptu na pyspark_test.py i wyczyszczeniu pliku pyspark.pyc, który został utworzony w oparciu o oryginalną nazwę mojego skryptu, co usunęło ten błąd.


2

W przypadku DSE (DataStax Cassandra & Spark) Do PYTHONPATH należy dodać następującą lokalizację

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

Następnie użyj dse pyspark, aby uzyskać moduły na ścieżce.

dse pyspark

2

Miałem ten sam problem i dodałbym jedną rzecz do zaproponowanych powyżej rozwiązań. Używając Homebrew na Mac OS X do zainstalowania Sparka, będziesz musiał poprawić adres ścieżki py4j, aby uwzględnić libexec w ścieżce (pamiętaj o zmianie wersji py4j na tę, którą posiadasz);

PYTHONPATH=$SPARK_HOME/libexec/python/lib/py4j-0.9-src.zip:$PYTHONPATH

Uwaga - próbowałem go rozpakować i użyć py4jtylko folderu, ale nie zadziałało. Użyj pliku zip ...
El Dude

2

W moim przypadku była to instalacja w innym pythonie dist_package (python 3.5), podczas gdy ja używałem pythona 3.6, więc poniższe pomogły:

python -m pip install pyspark

1

Możesz także utworzyć kontener Docker z Alpine jako systemem operacyjnym i zainstalować Python i Pyspark jako pakiety. Dzięki temu wszystko będzie w kontenerze.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.