импорт pyspark в оболочку python

111

Это копия чьего-то другого вопроса на другом форуме, на который так и не ответили, поэтому я подумал, что снова задам его здесь, так как у меня такая же проблема. (См. Http://geekple.com/blogs/feeds/Xgzu7/posts/351703064084736 )

У меня правильно установлен Spark на моем компьютере, и я могу без ошибок запускать программы python с модулями pyspark при использовании ./bin/pyspark в качестве интерпретатора python.

Однако, когда я пытаюсь запустить обычную оболочку Python, когда я пытаюсь импортировать модули pyspark, я получаю эту ошибку:

from pyspark import SparkContext

и это говорит

"No module named pyspark".

Как я могу это исправить? Есть ли переменная среды, которую мне нужно установить, чтобы указать Python на заголовки / библиотеки / библиотеки pyspark? Если моя искровая установка - / spark /, какие пути pyspark мне нужно включить? Или программы pyspark можно запускать только из интерпретатора pyspark?

Гленн Страйкер
источник
Они говорят, что изменение переменных среды «не очень эффективно, потому что это очень быстро отменяется bin / spark-submit». Возможно, вы сможете чему-то научиться из этого обмена
emmagras

Ответы:

97

Вот простой способ (если вас не беспокоит, как он работает !!!)

Используйте findspark

  1. Перейдите в свою оболочку Python

    pip install findspark
    
    import findspark
    findspark.init()
  2. импортировать необходимые модули

    from pyspark import SparkContext
    from pyspark import SparkConf
  3. Готово!!!

Суреш2692
источник
Другие решения у меня не работали. Сейчас я использую findspark в своей программе. Похоже на достойное решение проблемы.
Монах-аналитик
Я бы предпочел не делать этого .. но эй .. учитывая, что больше ничего не работает .. Я возьму.
javadba
51

Если он выводит такую ​​ошибку:

ImportError: нет модуля с именем py4j.java_gateway

Добавьте $ SPARK_HOME / python / build в PYTHONPATH:

export SPARK_HOME=/Users/pzhang/apps/spark-1.1.0-bin-hadoop2.4
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/build:$PYTHONPATH
Пэн Чжан 1516540
источник
9
Как описано в другом ответе stackoverflow.com/questions/26533169/ ... Мне пришлось добавить следующий экспорт PYTHONPATH = $ SPARK_HOME / python / lib / py4j-0.8.2.1-src.zip: $ PYTHONPATH
Мейерсон
46

Оказывается, корзина pyspark ЗАГРУЖАЕТ python и автоматически загружает правильные пути к библиотеке. Проверьте $ SPARK_HOME / bin / pyspark:

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

Я добавил эту строку в свой файл .bashrc, и теперь модули найдены правильно!

Гленн Страйкер
источник
1
В дополнение к этому шагу, я также необходимо добавить: export SPARK_HOME=~/dev/spark-1.1.0, пойди разберись. Ваши имена в папках могут отличаться.
emmagras 05
21

не запускайте свой файл py как: python filename.py вместо этого используйте:spark-submit filename.py

дронт
источник
Может кто-нибудь объяснить, почему бы этого не сделать? Я изучал этот вопрос, но до сих пор не смог найти ничего, что объясняло бы, почему это так.
Mint
@Mint Другие ответы показывают, почему; пакет pyspark не включен в $ PYTHONPATH по умолчанию, поэтому он import pysparkзавершится ошибкой в ​​командной строке или в исполняемом скрипте. Вы должны либо a. запустить pyspark через Spark-submit, как задумано, или b. добавьте $ SPARK_HOME / python в $ PYTHONPATH.
kingledion
Другой момент: spark-submit - это сценарий оболочки, который помогает вам правильно настроить системную среду перед использованием spark. Если вы просто выполняете python main.py, вам нужно правильно настроить системную среду, например PYTHONPATH, SPARK_HOME
E.ZY.
21

Экспортируя путь SPARK и путь Py4j, он начал работать:

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

Итак, если вы не хотите вводить их каждый раз, когда хотите запускать оболочку Python, вы можете добавить ее в свой .bashrcфайл

Dawny33
источник
1
Я не могу найти каталог libexec в своей Apache Sparkустановке, есть идеи?
Альберто Бонсанто,
@AlbertoBonsanto Извините. Я не сталкивался с этой проблемой. Итак, понятия не имею :(
Dawny33
1
Да они вынули папку libexec в Spark 1.5.2
bluerubez
1
@bluerubez Кажется, есть в Spark 1.6.2 ... Кроме того, не уверен, для чего предназначен libexec/python/buildкаталог, но у
Spark
17

На Mac я использую Homebrew для установки Spark (формула «apache-spark»). Затем я установил PYTHONPATH таким образом, чтобы импорт Python работал:

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

Замените «1.2.0» актуальной версией apache-spark на вашем Mac.

дзю
источник
14

Для выполнения Spark в pyspark два компонента должны работать вместе:

  • pyspark пакет python
  • Экземпляр Spark в JVM

При запуске вещей с помощью spark-submit или pyspark эти сценарии позаботятся об обоих, т.е. они настроят ваш PYTHONPATH, PATH и т.д., чтобы ваш сценарий мог найти pyspark, и они также запускают экземпляр Spark, настраивая в соответствии с вашими параметрами , например --master X

В качестве альтернативы можно обойти эти сценарии и запустить приложение Spark непосредственно в интерпретаторе Python, например python myscript.py. Это особенно интересно, когда искровые скрипты становятся более сложными и в конечном итоге получают свои собственные аргументы.

  1. Убедитесь, что пакет pyspark может быть найден интерпретатором Python. Как уже обсуждалось, добавьте каталог spark / python в PYTHONPATH или напрямую установите pyspark с помощью pip install.
  2. Задайте параметры экземпляра Spark из вашего скрипта (те, которые раньше передавались в pyspark).
    • Для конфигураций искры, которые вы обычно устанавливаете с помощью --conf, они определяются с помощью объекта конфигурации (или строковых конфигураций) в SparkSession.builder.config
    • Для основных параметров (таких как --master или --driver-mem) на данный момент вы можете установить их, записав в переменную среды PYSPARK_SUBMIT_ARGS. Чтобы сделать вещи чище и безопаснее, вы можете установить его из самого Python, и Spark будет читать его при запуске.
  3. Запустите экземпляр, который просто требует вызова getOrCreate()из объекта построителя.

Таким образом, ваш сценарий может иметь что-то вроде этого:

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

Чтобы избавиться от него ImportError: No module named py4j.java_gateway, нужно добавить следующие строки:

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

В Windows 10 у меня работало следующее. Я добавил следующие переменные среды, используя Настройки > Изменить переменные среды для вашей учетной записи :

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

(замените "C: \ Programming \ ..." на папку, в которую вы установили Spark)

JustAC0der
источник
5

Для пользователей Linux следующий правильный (и не запрограммированный жестко) способ включения библиотеки pyspark в PYTHONPATH. Обе части PATH необходимы:

  1. Путь к самому модулю Python pyspark, и
  2. Путь к заархивированной библиотеке, на которую этот модуль pyspark полагается при импорте

Обратите внимание, что версия заархивированной библиотеки определяется динамически, поэтому мы не программируем ее жестко.

export PYTHONPATH=${SPARK_HOME}/python/:$(echo ${SPARK_HOME}/python/lib/py4j-*-src.zip):${PYTHONPATH}
NYCeyes
источник
4

Я запускаю искровой кластер на виртуальной машине CentOS, которая устанавливается из пакетов cloudera yum.

Пришлось установить следующие переменные для запуска pyspark.

export SPARK_HOME=/usr/lib/spark;
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.9-src.zip:$PYTHONPATH
Sujesh Chirackkal
источник
4
export PYSPARK_PYTHON=/home/user/anaconda3/bin/python
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS='notebook'

Это то, что я сделал для использования своего дистрибутива Anaconda со Spark. Это не зависит от версии Spark. Вы можете изменить первую строку на корзину для Python ваших пользователей. Кроме того, начиная с Spark 2.2.0 PySpark доступен как автономный пакет на PyPi, но я еще не тестировал его.

Яяти Суле
источник
4

Вы можете получить pyspark pathв python, используя pip(если вы установили pyspark с помощью PIP), как показано ниже

pip show pyspark
user3524049
источник
3

У меня такая же проблема.

Также убедитесь, что вы используете правильную версию python и устанавливаете ее с правильной версией pip. в моем случае: у меня были как python 2.7, так и 3.x. Я установил pyspark с

pip2.7 установить pyspark

и это сработало.

этиника
источник
2

Я получил эту ошибку, потому что сценарий python, который я пытался отправить, назывался pyspark.py ( facepalm ). Исправление заключалось в том, чтобы настроить мой PYTHONPATH, как рекомендовано выше, затем переименовать скрипт в pyspark_test.py и очистить pyspark.pyc, который был создан на основе исходного имени моего скрипта и устранил эту ошибку.

Патрик
источник
2

В случае DSE (DataStax Cassandra & Spark) в PYTHONPATH необходимо добавить следующее местоположение

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

Затем используйте dse pyspark, чтобы получить модули в пути.

dse pyspark
Sreesankar
источник
2

У меня была такая же проблема, и я бы добавил одну вещь к предложенным выше решениям. При использовании Homebrew в Mac OS X для установки Spark вам нужно будет исправить адрес пути py4j, чтобы включить libexec в путь (не забудьте изменить версию py4j на ту, которая у вас есть);

PYTHONPATH=$SPARK_HOME/libexec/python/lib/py4j-0.9-src.zip:$PYTHONPATH
tjb305
источник
Примечание. Я попытался разархивировать его и использовать py4jтолько папку, но ничего не вышло. Используйте zip-файл ...
El Dude
2

В моем случае он устанавливался на другом python dist_package (python 3.5), тогда как я использовал python 3.6, поэтому помогло следующее:

python -m pip install pyspark
D Неприкасаемый
источник
1

Вы также можете создать контейнер Docker с Alpine в качестве ОС и установить Python и Pyspark в виде пакетов. Это все будет помещено в контейнер.

Эдди
источник