Чтобы добавить в наши практические курсы по Apache Spark еще больше приемов, полезных для дата-инженеров и разработчиков, сегодня рассмотрим, как упаковать PySpark-приложение, используя нативные Python-функции и сторонние решения. Отличия Virtualenv от PEX и Conda.
4 способа упаковать PySpark-приложение для запуска в кластере Apache Spark
Разработчики распределенных приложений знают, что недостаточно просто написать код на Python, чтобы запустить его в кластере Apache Spark под управлением YARN, Kubernetes или Mesos. Следует убедиться, что код и все используемые библиотеки доступны на исполнителях. Предположим, в коде используются UDF-функции Python-библиотеки Pandas, которая работает с PyArrow в качестве базовой реализации. Поэтому PyArrow должен быть установлен на каждом исполнителе в кластере. Иначе возникнет ошибка ModuleNotFoundError: No module named ‘pyarrow’. О том, что такое PyArrow и чем это полезно дата-инженеру и разработчику Spark-приложений, мы писали в этой статье.
На практике подобная ситуация случается достаточно часто. Поэтому можно выделить следующие сценарии применения средства упаковки PySpark-приложений с точки зрения дата-инженера и разработчика:
- возможность повторно использовать и охватывать все модули приложения;
- возможность размещения нескольких PySpark-скриптов обработки данных без необходимости писать шаблонный код, включая создание SparkSession, чтение свойств приложения, шифрование, дешифрование, пользовательские UDF-функции, тестовые наборы данных и прочие рутинные операции.
- пакетирование исходного кода, т.е. более одного файла с расширением .py, которые будут отправляться в spark-submit для запуска в кластере Apache Spark.
- минимизация обслуживания состояния с точки зрения развертывания приложений в кластере за счет отправки кода и зависимых модулей для запуска исполнителей.
Есть несколько способов управления зависимостями Python в кластере Apache Spark:
- нативные функции PySpark, которые позволяют загружать файлы Python (.py), заархивированные пакеты Python (.zip) и файлы Egg (.egg) в исполнители;
- Conda — популярная система управления пакетами Python. CLI-инструмент conda-pack позволяет создавать перемещаемые среды Conda и отправлять их в кластер;
- Virtualenv – средство для создания изолированных сред Python. Начиная с Python 3.3, часть его функций была интегрирована в Python в качестве стандартной библиотеки в модуле venv. Однако, virtualenv намного быстрее, и пользователи PySpark могут ее использовать для управления зависимостями Python в кластерах Apache Spark с помощью venv-pack аналогично conda-pack.
- PEX (Python Executable) – универсальное решение для виртуализации среды Python, аналогичное virtualenv.
Какой способ выбрать?
PySpark позволяет загружать Python-файлы (.py), заархивированные пакеты Python (.zip) и файлы Egg (.egg) в исполнители через установку параметра конфигурации spark.submit.pyFiles, настройку параметра —py-files в Spark-скриптах и через прямой вызов метода pyspark.SparkContext.addPyFile() в приложениях. Это простые способы отправить в кластер дополнительный пользовательский код Python: можно просто добавить отдельные файлы или заархивировать целые пакеты и загрузить их. А метод pyspark.SparkContext.addPyFile() позволяет загружать код даже после начала задания. Однако, нативные функции PySpark не позволяют добавлять пакеты в виде whl-файлов. Поэтому данный способ не дает возможности включать зависимости с собственным кодом и не очень применим на практике. Что представляют собой другие способы и как они работают, мы рассмотрим далее.
Virtualenv позволяет создать изолированную виртуальную среду Python для драйвера и исполнителя. Этот Python-инструмент упаковывает текущую виртуальную среду в файл архива и содержит интерпретатор Python и зависимости. Но для его использования нужно, чтобы на всех узлах в кластере был установлен один и тот же интерпретатор Python, поскольку venv-pack упаковывает его как символическую ссылку.
python -m venv pyspark_venv source pyspark_venv/bin/activate pip install pyarrow pandas venv-pack venv-pack -o pyspark_venv.tar.gz
PySpark также может использовать PEX для совместной доставки пакетов Python. Это инструмент создает автономную среду Python аналогично Conda или virtualenv, но файл .pex является исполняемым сам по себе. Он предназначен для использования драйвером и исполнителем, включая зависимости Python, указанные с помощью команды pex. Однако файл .pex не включает в себя сам интерпретатор Python, поэтому на всех узлах в кластере должен быть установлен один и тот же интерпретатор Python.
Процесс использования PEX состоит из следующих шагов:
- упаковать исходный код приложения в виде whl-файла;
- упаковать модули, зависящие от приложения, в виде файла PEX;
- с помощью spark-submit поместить pex-файл в каждый рабочий каталог исполнителя Spark, указав параметры —files или свойства spark.files, и добавить whl-файл в PYTHONPATH, также указав параметры —py-Files или свойство spark.submit.pyFiles;
- подготовить Py-файл триггера или обертку кода для доступа к файлу внутри whl-пакета. Имя файла триггера должно совпадать с именем скрипта, который нужно выполнить.
Чтобы передать и использовать файл .pex в кластере, его следует отправить с помощью конфигурации spark.files (spark.yarn.dist.files в YARN) или параметра —files, поскольку они являются обычными файлами, а не каталогами или архивными файлами. При отправке приложения не следует устанавливать PYSPARK_DRIVER_PYTHON для режимов кластера в YARN или Kubernetes.
export PYSPARK_DRIVER_PYTHON=python # Do not set in cluster modes. export PYSPARK_PYTHON=./pyspark_pex_env.pex spark-submit --files pyspark_pex_env.pex app.py
Освойте администрирование и использование Apache Spark для задач дата-инженерии, разработки распределенных приложений и аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
- Основы Apache Spark для разработчиков
- Анализ данных с Apache Spark
- Потоковая обработка в Apache Spark
- Машинное обучение в Apache Spark
- Графовые алгоритмы в Apache Spark
Источники