Если вы хотите запустить приложение PySpark на YARN в кластерном режиме, вам необходимо убедиться, что все используемые модули доступны на машинах кластера.
В противном случае вы можете получить ошибки, такие как .ModuleNotFoundError: No module named 'ИМЯМОДУЛЯ'
Вот скрипт myapptest.py который я хочу запустить в кластерном режиме:

from pyspark.conf import SparkConf
from pyspark.sql import SparkSession
from datetime import datetime, date
from pyspark.sql import Row
import pyspark
from transliterate import translit 
import sys

print(f"PY VERSION IS {sys.version}")
print(f"PY EXEC IS {sys.executable}")
text = "Lorem ipsum dolor sit amet"
print(translit(text, 'ru'))

conf = (
        SparkConf()
        .set("spark.sql.adaptive.enabled", "true")
)

spark = (
        SparkSession
        .builder
        .config(conf=conf)
        .getOrCreate()
)

sc = spark.sparkContext
sc.setLogLevel("INFO")

df = spark.createDataFrame([
    Row(a=1, b=2., c='string1', d=date(2000, 1, 1), e=datetime(2000, 1, 1, 12, 0)),
    Row(a=2, b=3., c='string2', d=date(2000, 2, 1), e=datetime(2000, 1, 2, 12, 0)),
    Row(a=4, b=5., c='string3', d=date(2000, 3, 1), e=datetime(2000, 1, 3, 12, 0))
])
df.show()

spark.stop()

На машинах кластера отсутствует модуль transliterate.
Я хочу создать виртуальное окружение(venv) с этой зависимостью и отправить его на кластер. В соответствии со статьей делаю следуещее:

/opt/conda/envs/python_3.7/bin/python -m venv pvpvenv
source pvpvenv/bin/activate
pip install transliterate venv-pack
venv-pack -o pyspark_venv.tar.gz

Отправляю на кластер:

export HADOOP_CONF_DIR=/etc/hadoop/conf
export PYSPARK_PYTHON=./environment/bin/python
/opt/spark3/bin/spark-submit --master yarn --deploy-mode cluster \
  --name cluster-test \
  --conf spark.yarn.dist.archives=pyspark_venv.tar.gz#environment \
  myapptest.py

И получаю ошибку:
image
В логах YARN ошибка:
image

Разбор

Закомментил импорт transliterate, что бы посмотреть вывод

print(f"PY VERSION IS {sys.version}")
print(f"PY EXEC IS {sys.executable}")

image
Как видим питон не тот, что передаем в PYSPARK_PYTHON

export PYSPARK_PYTHON=./environment/bin/python

Попробовал запустить, переда путь к питоны через conf

export HADOOP_CONF_DIR=/etc/hadoop/conf
/opt/spark3/bin/spark-submit --master yarn --deploy-mode cluster \
  --name cluster-test \
  --conf spark.yarn.dist.archives=pyspark_venv.tar.gz#environment \
  --conf spark.pyspark.python=./environment/bin/python \
  myapptest.py

Ошибка уже другая
image
Детальнее изучив логи, замечаю проблему в симлинках
image
Распаковываю наш тар-файл и вижу, что симлинки указывают на интерпретатор питона, расположенный на машинке, где я упаковывал виртуальное окружение. Конечно в кластере по такому пути питон отсутствует.
image

Решение

Так как venv-pack упаковывает интерпретатор Python как символическую ссылку, то нужно перепаковать наше виртуальное окружение, указав правильную ссылку на питон в симлинке.
Покапавшись немного в параметрах venv-pack нахожу нужную нам опцию --python-prefix. Перепаковываем и запускаем.

venv-pack -o pyspark_venv.tar.gz --python-prefix /opt/anaconda3/
export HADOOP_CONF_DIR=/etc/hadoop/conf
/opt/spark3/bin/spark-submit --master yarn --deploy-mode cluster \
  --name cluster-test \
  --conf spark.yarn.dist.archives=pyspark_venv.tar.gz#environment \
  --conf spark.pyspark.python=./environment/bin/python \
  myapptest.py

image
Успех)
Учтите что venv-pack довольно древний и не лишен багов.
Важный баг с симлинками


Published

Category

Notes

Tags

Contact