Как разработать свой плагин Apache AirFlow: пошаговое руководство с наглядной демонстрацией. Добавляем свои пункты меню в веб-интерфейс фреймворка и встраиваем пользовательскую HTML-страницу с новым эскизом Flask.
Разработка своего плагина для AirFlow
Вчера я рассказывала, как расширить функциональные возможности Apache AirFlow с помощью плагинов. Сегодня рассмотрим, как это сделать на практике. Чтобы вы могли повторить это несложное упражнение, в качестве среды развертывания Airflow возьму Google Colab, туннелировав веб-сервер с помощью утилиты ngrok. Сперва установим необходимые библиотеки и импортируем модули, а также создадим директории для размещения компонентов плагина.
Отдельно хочется сказать про пакет apache-airflow-providers-amazon: хотя напрямую он нигде в моем коде не используется, без него попытка зарегистрировать плагин в Airflow вызывала ошибку
Скорей всего, проблема связана с зависимостями Airflow, где многие интеграции вынесены в отдельные провайдеры, пакеты которых нужно вручную устанавливать.
Чтобы использовать пользовательский плагин, его нужно сохранить в правильный каталог. В моем случае структура каталогов выглядит так:
В этой структуре каталогов:
- Airflow — рабочая директория фреймворка;
- plugins — папка, в которой Airflow ищет плагины;
- my_plugin — папка плагина;
- __init__.py — пустой файл, который нужен, чтобы Python распознал папку как пакет;
- my_plugin.py — файл с кодом плагина;
- templates и static — папки для HTML-шаблонов и статических файлов, которые использует фреймворк Flask. Ведь именно Flask использует Airflow в качестве основного веб-фреймворка для своего пользовательского интерфейса. В папке templates надо сохранить HTML-файл страницы для визуального представления пользовательского плагина.
Плагин будет отображать в меню веб-интерфейса фреймворка пользовательские элементы и HTML-страницу. Предположим, я хочу встроить в меню AirFlow ссылки на сайты нашей Школы Больших Данных и Школы прикладного бизнес-анализа и проектирования информационных систем. Также добавим пункт меню «Мой плагин», который будет перенаправлять на HTML-страницу визуального представления плагина. Код такого пользовательского плагина выглядит следующим образом:
Этот плагин добавляет несколько расширений и интеграций в веб-интерфейс Airflow. AirflowPlugin является базовым классом для создания плагинов, Blueprint используется для создания эскизов Flask, чтобы управлять шаблонами и статическими файлами, BaseHook нужен для создания собственных хуков для подключения к различным сервисам. Flask использует концепцию эскизов (blueprint) для создания компонентов приложений и поддержки общих шаблонов внутри приложения или между приложениями. По сути, Blueprint — это способ организации Flask-приложения, который позволяет разбивать приложение на более мелкие и управляемые модули со своим маршрутом, обработчиками ошибок и пр. Так можно делить код на логические части, создавая отдельные файлы для различных функциональных областей Flask-приложения, таких как аутентификация, администрирование и пр.
Класс AirflowTestPlugin представляет собой главный класс плагина, который наследуется от AirflowPlugin. Он определяет различные компоненты плагина, такие как хуки, макросы, Flask Blueprints, представления и элементы меню, которые будут зарегистрированы в Airflow при загрузке плагина.
Класс PluginHook наследуется от BaseHook и его можно расширить для создания пользовательских хуков. Функция plugin_macro() – это макрос, который можно использовать в шаблонах Airflow. Он зарегистрирован как macros.test_plugin.plugin_macro. Чтобы интегрировать пользовательские страницы и статические ресурсы в веб-интерфейс Airflow, создается Blueprint с именем test_plugin, который указывает на папки с шаблонами и статическими файлами. Классы TestAppBuilderBaseView и TestAppBuilderBaseNoMenuView наследуются от AppBuilderBaseView и используются для создания пользовательских страниц во Flask AppBuilder. Методы test() отображают шаблон test_plugin/test.html с параметром content, содержащим данные для отображения в HTML-странице. Чтобы контролировать доступ к этим HTML-страницам, используется декоратор @has_access.
Для создания представлений и меню создаются v_appbuilder_view и v_appbuilder_nomenu_view как экземпляры соответствующих классов представлений. Они упаковываются в словари v_appbuilder_package и v_appbuilder_nomenu_package, которые затем регистрируются в плагине. Также создаются элементы меню appbuilder_mitem_1 и appbuilder_mitem_2, которые добавляют ссылки на внешние сайты в меню веб-интерфейса Airflow.
Разметка HTML-страницы для визуального представления пользовательского плагина выглядит так:
Поскольку в этом примере я решила отображать картинку на HTML-странице, путь к ней надо указать относительно директории, где размещен плагин в структуре проекта Airflow. Обычно, статические файлы для плагинов помещаются в папку static внутри каталога плагина.
Сохранив плагин, HTML-страницу и файл картинки в соответствующих папках, можно запускать Airflow. Я сделаю это локально на порту 8888, туннелировав веб-сервер фреймворка с помощью ngrok:
Просмотреть зарегистрированные таблицы можно в CLI-интерфейсе Colab, вызвав команду
Также успешно зарегистрированные плагины отображаются в веб-интерфейсе Airflow:
Благодаря плагину, меню Airflow изменилось: в него добавлены новые пункты:
Переход на страницу добавленного плагина отображает ее визуальное представление:
При разработке и отладке этого плагина мне приходилось постоянно перезапускать веб-сервер и планировщик фреймворка. Чтобы сделать это быстро в Google Colab, просто останавливала процессы и запускала фреймворк в standalone-режиме снова. Для остановки процессов использовала команду !pkill:
Таким образом, добавить свой плагин в Airflow оказалось не так сложно, однако, нужно очень внимательно сохранять все добавляемые компоненты в правильных папках согласно структуре каталогов Airflow-проекта с учетом особенностей как самого ETL-оркестратора, так и используемого им фреймворка Flask.
Узнайте больше про администрирование и эксплуатацию Apache AirFlow для оркестрации пакетных процессов в задачах реальной дата-инженерии на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
Копирование, размножение, распространение, перепечатка (целиком или частично), или иное использование материала допускается только с письменного разрешения правообладателя ООО "УЦ Коммерсант"