Переменные в Apache AirFlow: примеры и советы

Airflow переменные, курсы Airflow, обучение Airflow, настройка Airflow, Airflow для дата-инженера

Зачем нужны переменные в Apache AirFlow, какие они бывают, как создать переменную и использовать ее: примеры и рекомендации для эффективной дата-инженерии.

Зачем нужны переменные в Apache AirFlow, и какие они бывают

Чтобы хранить информацию, которая редко меняется, например, ключи API, пути к конфигурационным файлам, в Apache Airflow используются переменные. Переменные являются глобальной концепцией конфигурации среды выполнения Airflow и определяются с помощью  объекта airflow.model.variable. Переменная представляет собой пару ключ-значение и может храниться в примитивном типе данных (строка или число) или в виде небольших объектов JSON. Данные целесообразно записывать в переменные при соблюдении следующих условий:

  • данные могут зависеть от времени выполнения, но не меняются часто;
  • данные должны быть доступны во всем экземпляре Airflow.

Рекомендуется избегать использования переменных Airflow вне задач в коде DAG верхнего уровня, который не является частью DAG или экземпляров оператора и находится вне операторов, например, для запросов к внешним системам. Такое код обычно создает соединение с метахранилищем Airflow каждый раз при парсинге DAG, снижая производительность. Если же переменные Airflow все-таки используются в коде DAG верхнего уровня, рекомендуется работать с ними через синтаксис шаблона Jinja, чтобы они отображались только при выполнении задачи. Шаблонизация позволяет передавать динамическую информацию в экземпляры задач во время выполнения. Для обеспечения безопасности при записи в метахранилище Airflow переменные шифруются с помощью Fernet-реализации симметричного шифрования, гарантируя невозможность их изменения или прочтения без ключа. Чтобы скрыть отображение их значений в пользовательском интерфейсе и логах, следует включить подстроку, указывающую на конфиденциальное значение, в имя переменной. Многие переменные по умолчанию маскируются в пользовательском интерфейсе и логах благодаря включению конфигурации hide_sensitive_var_conn_fields. Она изначально установлена в True для всех переменных, содержащие строки access_token, api_key, apikey, authorization, passphrase, passwd, password, private_key, secret, token. Этот список можно расширить, добавив в конфигурацию sensitive_var_conn_names строки, разделенные запятыми.

С версии 2.7.0 в Airflow добавлена экспериментальная функция локального кэширования переменных, отключенная по умолчанию. Она работает только на этапе синтаксического анализа (парсинга) DAG, чтобы ускорить этот процесс. Наибольшую эффективность локальное кэширование дает в случае, когда переменные используются в коде верхнего уровня, чего рекомендуется избегать. При запуске задач DAG кэширование не выполняется.

Создать переменную в Airflow можно несколькими способами:

  • в GUI через добавление или импорт из файла;
  • команды CLI-интерфейса;
  • программным образом из DAG или задачи.

Также можно создать обычную переменную из переменной среды, которая хранит небольшие фрагменты информации, доступные для всей среды. Их нельзя увидеть в пользовательском интерфейсе фреймворка напрямую, но к ним можно получить доступ, используя os.getenv(«MY_ENV_VAR») внутреннюю часть DAG и задач Airflow. Переменные среды очень универсальны: их можно использовать для хранения произвольной информации и для настройки Airflow. Переменные среды часто используются для хранения учетных данных в локальной разработке и их создание можно включить в процесс CI/CD. В соответствии с соглашением об именовании, все переменные среды называются заглавными буквами по шаблону AIRFLOW_VAR_{VARIABLE_NAME}. Одинарные подчеркивания окружают VAR, что контрастирует со способом хранения параметров в конфигурационном файле airflow.cfg, где двойные подчеркивания окружают имя раздела конфигурации. Переменные, заданные с помощью переменных среды, не будут отображаться в пользовательском интерфейсе Airflow, но их можно использовать их в файле DAG. Переменные, заданные с помощью переменных среды, будут иметь приоритет над переменными, определенными в пользовательском интерфейсе.

Примеры использования и лучшие практики

Как уже было отмечено ранее, в переменных удобно хранить информацию, которая меняется довольно редко, и нужна нескольким задачам и/или DAG’ам во всем экземпляре AirFlow. Например, ключ API внешнего сервиса. Чтобы использовать переменную в Python-операторе, надо импортировать класс Variable из модуля airflow.models, а потом вызвать метод get() у его объекта:

from airflow.models import Variable
api_key = Variable.get("api_key")
def fetch_data():
    # Использование api_key для запроса данных
    pass

Таким образом, использование переменных повышает гибкость кода, позволяя изменять поведение DAG без изменений в его коде. Например, DAG используется в разных средах (разработка, тестирование, производство), и для каждой среды требуется свой ключ API. Вместо того чтобы изменять код DAG при переключении между средами, можно использовать переменные Airflow для хранения соответствующих ключей. Это повышает гибкость и облегчает управление конфигурациями. Например, создадим  несколько переменных для каждой среды:

  • api_key_dev — для среды разработки;
  • api_key_test — для тестовой среды;
  • api_key_prod — для производственной среды.

Изменение кода DAG для использования соответствующего ключа будет выглядеть так:

from airflow.models import Variable
# Получение текущей среды, например, через переменную окружения Airflow
environment = Variable.get("environment")  # одно из значений  'dev', 'test' или 'prod'
# Формирование имени переменной с ключом API на основе окружения
api_key_variable = f"api_key_{environment}"
api_key = Variable.get(api_key_variable)
def fetch_data():
    # Использование подходящего api_key для запроса данных
    pass

Когда необходимо переключиться на другое окружение, достаточно изменить значение переменной environment на соответствующее, например, с dev на prod. И в коде DAG автоматически будет использоваться подходящий ключ API без внесения изменений. Так можно легко переключаться между разными конфигурациями, изменяя только переменные Airflow. Кроме того, такой подход повышает безопасность, поскольку ключи API хранятся в управляемых переменных в зашифрованном виде. Наконец, повышается удобство развертывания, поскольку один и тот же код DAG может использоваться в разных средах, что упрощает процессы CI/CD.

В заключение отметим, что при работе с переменными есть риск утечки чувствительных данных, если хранить их без соответствующих мер защиты, например, отключив маскирование в GUI. Также при большом количестве переменных растет сложность управления ими и может снизиться производительность среды при их интенсивном использовании из-за частого обращения к базе данных метаданных фреймворка.

Тем не менее, использование переменных в Airflow можно назвать эффективной практикой дата-инженера, при работе с которой рекомендуется соблюдать следующие советы:

  • переменные – не лучший вариант для хранения чувствительных данных. Вместо них лучше для секретной информации использовать подключения или специализированные решения для управления секретами.
  • называть переменные следует семантически понятно и документировать их использование через комментарии в коде;
  • наконец, надо сократить количество переменных, сохраняя в них только действительно необходимые данные.

Освойте эти и другие тонкости администрирования и эксплуатации Apache AirFlow на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Источники

  1. https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/variables.html
  2. https://airflow.apache.org/docs/apache-airflow/stable/howto/variable.html
  3. https://www.astronomer.io/docs/learn/airflow-variables
  4. https://airflow.apache.org/docs/apache-airflow/stable/configurations-ref.html#config-secrets-use-cache
Я даю свое согласие на обработку персональных данных и соглашаюсь с политикой конфиденциальности.
Поиск по сайту