Автоматизация задач Yandex Query с помощью Yandex Managed Service for Apache Airflow™
Managed Service for Apache Airflow™ — это популярный инструмент для автоматизации операций с данными. Yandex Query поддерживает интеграцию с Managed Service for Apache Airflow™ с помощью pip-пакета apache-airflow-providers-yandex
Чтобы создать инфраструктуру для автоматизации задач Yandex Query c помощью Managed Service for Apache Airflow™, выполните следующие шаги:
- Подготовьте облако к работе.
- Создайте сервисный аккаунт.
- Создайте облачную сеть и подсети.
- Подготовьте бакет в Object Storage.
- Настройте NAT для доступа в интернет.
- Создайте кластер Managed Service for Apache Airflow™.
- Подготовьте DAG-файл и запустите граф.
- Проверьте результат.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки создаваемой инфраструктуры входит:
- плата за использование бакета (см. тарифы Yandex Object Storage);
- плата за использование NAT-шлюза (см. тарифы Yandex Virtual Private Cloud);
- плата за объем считанных данных (см. тарифы Yandex Query);
- плата за использование кластера Yandex Managed Service for Apache Airflow™ (см. тарифы Managed Service for Apache Airflow™).
Создайте сервисный аккаунт
Создайте сервисный аккаунт airflow-sa
с ролью editor
на каталог, в котором будет создан кластер Managed Service for Apache Airflow™:
- В консоли управления
выберите каталог, в котором хотите создать сервисный аккаунт. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта:
airflow-sa
. - Нажмите
Добавить роль и выберите рольeditor
. - Нажмите кнопку Создать.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Создайте сервисный аккаунт
airflow-sa
:yc iam service-account create airflow-sa
Результат:
id: nfersamh4sjq******** folder_id: b1gc1t4cb638******** created_at: "2023-09-21T10:36:29.726397755Z" name: airflow-sa
Сохраните идентификатор сервисного аккаунта
airflow-sa
(id
) и каталога, в котором его создали (folder_id
). -
Назначьте сервисному аккаунту роль
editor
на каталог, указав сохраненные ранее идентификаторы каталога и сервисного аккаунта:yc resource-manager folder add-access-binding <идентификатор_каталога> \ --role editor \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>
Чтобы создать сервисный аккаунт, воспользуйтесь методом create для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/Create.
Чтобы назначить сервисному аккаунту роль editor
на каталог, воспользуйтесь методом setAccessBindings для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/SetAccessBindings.
Создайте облачную сеть и подсети
Все ресурсы, созданные в руководстве, будут относиться к одной облачной сети.
- В консоли управления
выберите каталог. - В списке сервисов выберите Virtual Private Cloud.
- Нажмите кнопку Создать сеть.
- В поле Имя укажите
yq-network
. - В поле Дополнительно выберите опцию
Создать подсети
. - Нажмите кнопку Создать сеть.
-
Создайте сеть
yq-network
:yc vpc network create yq-network
Результат:
id: enptrcle5q3d******** folder_id: b1g9hv2loamq******** created_at: "2022-04-04T05:25:03Z" name: yq-network default_security_group_id: enpbsnnop4ak********
Подробнее о команде
yc vpc network create
см. в справочнике CLI. -
Создайте подсети:
-
В зоне доступности
ru-central1-a
:yc vpc subnet create yq-network-ru-central1-a \ --zone ru-central1-a \ --network-name yq-network \ --range 10.1.0.0/16
Результат:
id: b0c3pte4o2kn******** folder_id: b1g9hv2loamq******** created_at: "2022-04-04T09:28:08Z" name: yq-network-ru-central1-a network_id: enptrcle5q3d******** zone_id: ru-central1-a v4_cidr_blocks: - 10.1.0.0/16
-
В зоне доступности
ru-central1-b
:yc vpc subnet create yq-network-ru-central1-b \ --zone ru-central1-b \ --network-name yq-network \ --range 10.2.0.0/16
-
В зоне доступности
ru-central1-d
:yc vpc subnet create yq-network-ru-central1-d \ --zone ru-central1-d \ --network-name yq-network \ --range 10.3.0.0/16
Подробнее о команде
yc vpc subnet create
см. в справочнике CLI. -
-
Чтобы создать сеть, воспользуйтесь методом REST API create для ресурса Network или вызовом gRPC API NetworkService/Create.
-
Чтобы создать подсети, воспользуйтесь методом REST API create для ресурса Subnet или вызовом gRPC API SubnetService/Create.
Подготовьте бакет в Object Storage
Создайте бакет
- В консоли управления
выберите каталог. - В списке сервисов выберите Object Storage.
- Нажмите кнопку Создать бакет.
- В поле Имя укажите уникальное имя бакета, например
airflow-bucket
. - В полях Доступ на чтение объектов и Доступ к списку объектов выберите
Публичный
. - Нажмите кнопку Создать бакет.
Если у вас еще нет интерфейса командной строки AWS CLI, установите и сконфигурируйте его.
-
Создайте бакет, указав для него уникальное имя:
aws --endpoint-url https://storage.yandexcloud.net \ s3 mb s3://<имя_бакета>
Результат:
make_bucket: s3://airflow-bucket
-
Включите публичный доступ к чтению объектов и списка объектов в созданном бакете:
aws --endpoint-url https://storage.yandexcloud.net \ s3api put-bucket-acl \ --bucket <имя_бакета> \ --acl public-read
Чтобы создать бакет, воспользуйтесь методом REST API create для ресурса Bucket, вызовом gRPC API BucketService/Create или методом S3 API create.
Настройте ACL для бакета
Отредактируйте ACL созданного бакета так, чтобы у сервисного аккаунта airflow-sa
было разрешение READ
.
Настройте NAT для доступа в интернет
Создайте NAT-шлюз
- В консоли управления
выберите каталог. - В списке сервисов выберите Virtual Private Cloud.
- На панели слева выберите Шлюзы.
- Нажмите кнопку Создать шлюз и в открывшемся окне:
- В поле Имя укажите имя
yq-nat
. - В поле Тип выберите
NAT-шлюз
. - Нажмите кнопку Сохранить.
- В поле Имя укажите имя
Создайте NAT-шлюз в каталоге по умолчанию:
yc vpc gateway create \
--name yq-nat
Результат:
id: enpkq1sb7hed********
folder_id: b1g681qpemb4********
created_at: "2024-05-19T13:20:36Z"
name: yq-nat
shared_egress_gateway: {}
Подробнее о команде yc vpc gateway create
см. в справочнике CLI.
Сохраните идентификатор (id
) NAT-шлюза, он понадобится при создании таблицы маршрутизации.
Чтобы создать NAT-шлюз, воспользуйтесь методом REST API create для ресурса Gateway или вызовом gRPC API GatewayService/Create.
Создайте таблицу маршрутизации
- На панели слева выберите Таблицы маршрутизации.
- Нажмите кнопку Создать таблицу маршрутизации и введите параметры таблицы маршрутизации:
- Введите имя
yq-route-table
. - Выберите сеть
yq-network
. - Нажмите кнопку Добавить маршрут.
- В поле Next hop выберите
Шлюз
. - В поле Шлюз выберите NAT-шлюз
yq-nat
. Префикс назначения заполнится автоматически.
- В поле Next hop выберите
- Нажмите кнопку Добавить.
- Введите имя
- Нажмите кнопку Создать таблицу маршрутизации.
Создайте таблицу маршрутизации с NAT-шлюзом yq-nat
в качестве next hop и префиксом назначения 0.0.0.0/0
:
yc vpc route-table create \
--name=yq-route-table \
--network-name=yq-network \
--route destination=0.0.0.0/0,gateway-id=<идентификатор_NAT-шлюза>
Результат:
id: enp4v8foko6s********
folder_id: b1g681qpemb4********
created_at: "2024-05-19T13:22:47Z"
name: yq-route-table
network_id: enppoggov6ub********
static_routes:
- destination_prefix: 0.0.0.0/0
gateway_id: enpkq1sb7hed********
Подробнее о команде yc vpc route-table create
см. в справочнике CLI.
Чтобы создать таблицу маршрутизации, воспользуйтесь методом REST API create для ресурса RouteTable или вызовом gRPC API RouteTableService/Create.
Привяжите таблицу маршрутизации к подсети
Привяжите таблицу маршрутизации к одной из подсетей, чтобы направить трафик подсети через NAT-шлюз:
- На панели слева выберите
Подсети. - В строке подсети
yq-network-ru-central1-a
нажмите кнопку . - Нажмите Привязать таблицу маршрутизации и выберите таблицу
yq-route-table
. - Нажмите кнопку Привязать.
Выполните команду:
yc vpc subnet update yq-network-ru-central1-a \
--route-table-name=yq-route-table
Результат:
id: e9b6n3jj3gh6********
folder_id: b1g681qpemb4********
created_at: "2024-05-19T13:24:58Z"
name: yq-network-ru-central1-a
network_id: enppoggov6ub********
zone_id: ru-central1-a
v4_cidr_blocks:
- 10.1.0.0/16
route_table_id: enp4v8foko6s********
dhcp_options: {}
Подробнее о команде yc vpc subnet update
см. в справочнике CLI.
Чтобы привязать таблицу маршрутизации к подсети, воспользуйтесь методом REST API update для ресурса Subnet или вызовом gRPC API SubnetService/Update.
Важно
Метод API переопределит все параметры изменяемого объекта, которые не были явно переданы в запросе, на значения по умолчанию. Чтобы избежать этого, перечислите настройки, которые вы хотите изменить, в параметре updateMask
(одной строкой через запятую).
Создайте кластер Managed Service for Apache Airflow™
-
В консоли управления
выберите каталог, в котором нужно создать кластер. -
Выберите сервис Managed Service for Apache Airflow™.
-
Нажмите кнопку Создать кластер.
-
В блоке Базовые параметры укажите имя кластера. Имя должно быть уникальным в рамках каталога.
-
В блоке Настройки доступа задайте пароль пользователя-администратора. Пароль должен иметь длину не менее 8 символов и содержать как минимум:
- одну заглавную букву;
- одну строчную букву;
- одну цифру;
- один специальный символ.
Примечание
Сохраните пароль локально или запомните его. Сервис не показывает пароли после создания.
-
В блоке Сетевые настройки выберите:
-
зону доступности
ru-central1-a
; -
облачную сеть
yq-network
; -
подсеть
yq-network-ru-central1-a
; -
группу безопасности по умолчанию.
Настройки группы безопасности не влияют на доступ к веб-интерфейсу Apache Airflow™.
-
-
В блоке Зависимости укажите название pip-пакета и ограничение на его версии:
apache-airflow-providers-yandex>=3.10
-
В блоке Хранилище DAG-файлов выберите созданный ранее бакет.
-
Нажмите кнопку Создать.
Подготовьте DAG-файл и запустите граф
Ниже используется направленный ациклический граф (DAG) с двумя вершинами:
yq_operator
— выполняет простой запрос к Yandex Query;output_operator
— выводит результат выполнения вершиныyq_operator
.
Чтобы подготовить DAG:
-
Создайте локально файл с именем
yq_dag.py
, скопируйте в него скрипт:yq_dag.py
import datetime from airflow.models.dag import DAG from airflow.providers.yandex.operators.yq import YQExecuteQueryOperator from airflow.operators.python_operator import PythonOperator with DAG( dag_id="yq_hello_world_operator", schedule_interval="@hourly", start_date=datetime.datetime.now(), ) as dag: yq_operator = YQExecuteQueryOperator( task_id="yq_operator", sql="SELECT 'Hello, world!'" ) def print_context(ds=None, **kwargs): ti = kwargs["ti"] print(ti.xcom_pull(task_ids="yq_operator")) output_operator = PythonOperator( task_id="output_operator", provide_context=True, python_callable=print_context ) yq_operator >> output_operator if __name__ == "__main__": dag.test()
-
Загрузите DAG в кластер Managed Service for Apache Airflow™. Для этого создайте в бакете
airflow-bucket
папкуfiles/dags
и загрузите в нее файлyq_dag.py
. -
Убедитесь, что в разделе DAGs появился новый DAG
yq_hello_world_operator
.Примечание
Загрузка DAG-файла из бакета может занять несколько минут.
-
Чтобы запустить DAG, в строке с его именем сначала нажмите кнопку , затем — Trigger DAG.
Проверьте результат
- В разделе DAGs откройте граф
yq_hello_world_operator
. - Перейдите в раздел Grid.
- Выберите задание yq_operator.
- Перейдите в раздел XCom.
- Убедитесь, что в строке
return_value
есть элемент'rows': [['Hello, world!']]
. Это значит, что запрос выполнен успешно.
Удалите созданные ресурсы
Чтобы удалить инфраструктуру и перестать платить за созданные ресурсы:
- Удалите бакет Object Storage.
- Отвяжите и удалите таблицу маршрутизации.
- Удалите NAT-шлюз.
- Удалите кластер Apache Airflow™.
- При необходимости удалите подсети, сеть и сервисный аккаунт.