Как изменить исполняемый файл Python, используемый работниками спарк во время выполнения из ноутбука Jupyter - PullRequest
0 голосов
/ 12 апреля 2019

Я настраиваю кластер Spark, используя YARN с Jupyterhub, работающим на главном узле.Я установил python 2 и 3 на всех узлах, использующих conda, и я хочу, чтобы пользователи могли указать, с какой версией Python они выполняют код.Это необходимо, поскольку некоторые библиотеки, используемые в пользовательских функциях Python, еще не поддерживают Python 3.

Я создал файл конфигурации ядра

{
    "argv": [
        "python",
        "-m",
        "ipykernel_launcher",
        "-f",
        "{connection_file}"
    ],
    "display_name": "Python 3",
    "language": "python",
    "env": {
        "PYSPARK_PYTHON": "python3",
        "PYSPARK_DRIVER_PYTHON": "/opt/anaconda/envs/py3/bin/python"
    }
}

, чтобы указать на правильный исполняемый файл Python, и создалсеанс, использующий

spark = pyspark.sql.SparkSession \
   .builder \
   .appName("MyApp") \
   .config("spark.pyspark.python", "/opt/anaconda/envs/py3/bin/python")\
   .config("spark.executorEnv.PYTHONPATH", "/opt/anaconda/envs/py3/bin/python")\
   .getOrCreate()

, который также устанавливает исполняемый файл python двумя различными способами.При просмотре вкладки «Окружение» пользовательского интерфейса Spark эти значения установлены правильно.

Однако, когда я запускаю любой искровой запрос (например, пример вычисления pi), я получаю Exception: Python in worker has different version 2.7 than that in driver 3.7, PySpark cannot run with different minor versions.Please check environment variables PYSPARK_PYTHON and PYSPARK_DRIVER_PYTHON are correctly set.

Как можноЯ указываю исполняемый файл Python из Блокнота Jupyter?

1 Ответ

1 голос
/ 13 апреля 2019

Вы можете принудительно вызвать переменные окружения в python из своего ноутбука перед созданием сеанса искры.

import os

os.environ['PYSPARK_PYTHON'] = '/opt/anaconda/envs/py3/bin/python'
os.environ['PYSPARK_DRIVER_PYTHON'] = '/opt/anaconda/envs/py3/bin/python'

# ....
spark = SparkSession.getOrCreate()
...