1. Введение
Рабочие процессы — это распространенный сценарий использования в анализе данных: они включают в себя сбор, преобразование и анализ данных для поиска в них значимой информации. В Google Cloud Platform инструментом для организации рабочих процессов является Managed Apache Airflow, представляющий собой размещенную версию популярного инструмента с открытым исходным кодом Apache Airflow. В этой лабораторной работе вы будете использовать Managed Apache Airflow для создания простого рабочего процесса, который создает кластер Managed Apache Spark, анализирует его с помощью Managed Apache Spark и Apache Hadoop, а затем удаляет кластер Managed Apache Spark.
Что такое управляемый Apache Airflow?
Управляемый Apache Airflow — это полностью управляемый сервис оркестрации рабочих процессов, позволяющий создавать, планировать и отслеживать конвейеры обработки данных, охватывающие облачные и локальные центры обработки данных. Созданный на основе популярного проекта с открытым исходным кодом Apache Airflow и работающий на языке программирования Python, управляемый Apache Airflow не привязан к конкретному поставщику и прост в использовании.
Используя управляемый Apache Airflow вместо локального экземпляра Apache Airflow, пользователи могут в полной мере воспользоваться преимуществами Airflow без необходимости установки или управления.
Что такое Apache Airflow?
Apache Airflow — это инструмент с открытым исходным кодом, используемый для программного создания, планирования и мониторинга рабочих процессов. В ходе лабораторной работы вам следует запомнить несколько ключевых терминов, связанных с Airflow:
- DAG (ориентированный ациклический граф) — это набор организованных задач, которые вы хотите запланировать и выполнить. DAG, также называемые рабочими процессами, определяются в стандартных файлах Python.
- Оператор — это оператор, описывающий отдельную задачу в рабочем процессе.
Что такое управляемый Apache Spark?
Managed Apache Spark — это полностью управляемый сервис Apache Spark и Apache Hadoop от Google Cloud Platform. Managed Apache Spark легко интегрируется с другими сервисами GCP, предоставляя вам мощную и полноценную платформу для обработки данных, аналитики и машинного обучения.
Что вы будете делать
В этом практическом задании показано, как создать и запустить рабочий процесс Apache Airflow в управляемом Apache Airflow, который выполняет следующие задачи:
- Создает управляемый кластер Apache Spark.
- Запускает задачу подсчета слов Apache Hadoop в кластере и выводит ее результаты в облачное хранилище.
- Удаляет кластер
Что вы узнаете
- Как создать и запустить рабочий процесс Apache Airflow в управляемом Apache Airflow
- Как использовать управляемые Apache Airflow и Apache Spark для проведения анализа набора данных
- Как получить доступ к управляемой среде Apache Airflow через консоль Google Cloud Platform, Cloud SDK и веб-интерфейс Airflow.
Что вам понадобится
- учетная запись GCP
- Базовые знания командной строки.
- Базовое понимание Python
2. Настройка GCP
Создать проект
Выберите или создайте проект на платформе Google Cloud.
Запишите идентификатор вашего проекта, который вы будете использовать на последующих этапах.
При создании нового проекта идентификатор проекта находится непосредственно под названием проекта на странице создания. |
|
Если вы уже создали проект, вы можете найти его идентификатор на главной странице консоли в карточке «Информация о проекте». |
|
Включите API
Включите API управляемого Apache Airflow, управляемого Apache Spark и облачного хранилища . После их включения вы можете проигнорировать кнопку «Перейти к учетным данным» и перейти к следующему шагу руководства. |
|
Создание управляемой среды Apache Airflow
Создайте управляемую среду Apache Airflow со следующей конфигурацией:
Все остальные параметры можно оставить по умолчанию. Нажмите кнопку «Создать» внизу. |
|
Создать сегмент облачного хранилища
В вашем проекте создайте хранилище Cloud Storage со следующей конфигурацией:
Нажмите «Создать», когда будете готовы. |
|
3. Настройка Apache Airflow
Просмотр информации об управляемой среде Apache Airflow
В консоли GCP откройте страницу «Окружения» .
Щёлкните по названию среды, чтобы просмотреть её подробные характеристики.
На странице с подробными сведениями об окружении представлена информация, такая как URL-адрес веб-интерфейса Airflow, идентификатор кластера Google Kubernetes Engine, имя сегмента Cloud Storage и путь к папке /dags.
В Airflow направленный ациклический граф ( DAG ) — это набор организованных задач, которые вы хотите запланировать и выполнить. DAG, также называемые рабочими процессами, определяются в стандартных файлах Python. Управляемый Apache Airflow планирует только DAG в папке /dags. Папка /dags находится в хранилище Cloud Storage, которое управляемый Apache Airflow создает автоматически при создании вашей среды.
Настройка переменных среды Apache Airflow
Переменные Apache Airflow — это специфическое для Airflow понятие, отличное от переменных окружения . На этом шаге вы установите следующие три переменные Airflow : gcp_project , gcs_bucket и gce_zone .
Использование gcloud для установки переменных
Сначала откройте Cloud Shell , в котором уже удобно установлен Cloud SDK.
Установите переменную среды COMPOSER_INSTANCE равным имени вашей управляемой среды Apache Airflow.
COMPOSER_INSTANCE=my-airflow-environment
Чтобы задать переменные Airflow с помощью инструмента командной строки gcloud, используйте команду ` gcloud composer environments run с подкомандой ` variables . Эта команда gcloud composer выполняет подкоманду Airflow CLI ` variables . Подкоманда передает аргументы инструменту командной строки gcloud .
Эту команду нужно выполнить три раза, заменив переменные на те, которые относятся к вашему проекту.
Установите переменную gcp_project , используя следующую команду, заменив <your-project-id> на идентификатор проекта, который вы записали на шаге 2.
gcloud composer environments run ${COMPOSER_INSTANCE} \
--location us-central1 variables -- --set gcp_project <your-project-id>
Результат будет выглядеть примерно так.
kubeconfig entry generated for us-central1-my-airflow-env-123abc-gke.
Executing within the following Kubernetes cluster namespace: composer-1-10-0-airflow-1-10-2-123abc
[2020-04-17 20:42:49,713] {settings.py:176} INFO - settings.configure_orm(): Using pool settings. pool_size=5, pool_recycle=1800, pid=449
[2020-04-17 20:42:50,123] {default_celery.py:90} WARNING - You have configured a result_backend of redis://airflow-redis-service.default.svc.cluste
r.local:6379/0, it is highly recommended to use an alternative result_backend (i.e. a database).
[2020-04-17 20:42:50,127] {__init__.py:51} INFO - Using executor CeleryExecutor
[2020-04-17 20:42:50,433] {app.py:52} WARNING - Using default Composer Environment Variables. Overrides have not been applied.
[2020-04-17 20:42:50,440] {configuration.py:522} INFO - Reading the config from /etc/airflow/airflow.cfg
[2020-04-17 20:42:50,452] {configuration.py:522} INFO - Reading the config from /etc/airflow/airflow.cfg
Установите переменную gcs_bucket , используя следующую команду, заменив <your-bucket-name> на идентификатор корзины, который вы записали на шаге 2. Если вы следовали нашим рекомендациям, имя вашей корзины совпадает с идентификатором вашего проекта. Результат будет аналогичен результату предыдущей команды.
gcloud composer environments run ${COMPOSER_INSTANCE} \
--location us-central1 variables -- --set gcs_bucket gs://<your-bucket-name>
Установите значение параметра gce_zone с помощью следующей команды. Результат будет аналогичен результатам выполнения предыдущих команд.
gcloud composer environments run ${COMPOSER_INSTANCE} \
--location us-central1 variables -- --set gce_zone us-central1-a
(Необязательно) Использование gcloud для просмотра переменной
Чтобы увидеть значение переменной, выполните подкоманду Airflow CLI variables с аргументом get или воспользуйтесь пользовательским интерфейсом Airflow .
Например:
gcloud composer environments run ${COMPOSER_INSTANCE} \
--location us-central1 variables -- --get gcs_bucket
Это можно сделать с любой из трех только что установленных переменных: gcp_project , gcs_bucket и gce_zone .
4. Пример рабочего процесса
Давайте посмотрим на код для DAG, который мы будем использовать на шаге 5. Пока не беспокойтесь о загрузке файлов, просто следуйте инструкциям здесь.
Здесь много чего нужно обсудить, поэтому давайте разберем это по частям.
from airflow import models
from airflow.contrib.operators import dataproc_operator
from airflow.utils import trigger_rule
Начнём с импорта некоторых файлов из Airflow:
-
airflow.models— позволяет получать доступ к данным в базе данных Airflow и создавать в ней данные. -
airflow.contrib.operators— Здесь размещаются операторы из сообщества. В данном случае нам нуженdataproc_operatorдля доступа к управляемому API Apache Spark. -
airflow.utils.trigger_rule— Для добавления правил запуска для наших операторов. Правила запуска позволяют точно контролировать, должен ли оператор выполняться в зависимости от состояния его родительских элементов.
output_file = os.path.join(
models.Variable.get('gcs_bucket'), 'wordcount',
datetime.datetime.now().strftime('%Y%m%d-%H%M%S')) + os.sep
Это указывает местоположение нашего выходного файла. Важная строка здесь — models.Variable.get('gcs_bucket') , которая получит значение переменной gcs_bucket из базы данных Airflow.
WORDCOUNT_JAR = (
'file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar'
)
input_file = 'gs://pub/shakespeare/rose.txt'
wordcount_args = ['wordcount', input_file, output_file]
-
WORDCOUNT_JAR— путь к файлу .jar, который мы в конечном итоге запустим в управляемом кластере Apache Spark. Он уже размещен в GCP. -
input_file— путь к файлу, содержащему данные, которые в конечном итоге будут обрабатываться в нашей задаче Hadoop. Мы загрузим данные в это место вместе на шаге 5. -
wordcount_args— Аргументы, которые мы передадим в JAR-файл.
yesterday = datetime.datetime.combine(
datetime.datetime.today() - datetime.timedelta(1),
datetime.datetime.min.time())
Это даст нам объект даты и времени, эквивалентный полуночи предыдущего дня. Например, если это выполняется в 11:00 4 марта, объект даты и времени будет представлять 00:00 3 марта. Это связано с тем, как Airflow обрабатывает планирование. Более подробную информацию об этом можно найти здесь .
default_dag_args = {
'start_date': yesterday,
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': datetime.timedelta(minutes=5),
'project_id': models.Variable.get('gcp_project')
}
Переменная default_dag_args в виде словаря должна передаваться при каждом создании нового DAG:
-
'email_on_failure'— указывает, следует ли отправлять оповещения по электронной почте при сбое задачи. -
'email_on_retry'— указывает, следует ли отправлять оповещения по электронной почте при повторной попытке выполнения задачи. -
'retries'— указывает, сколько попыток повтора Airflow должен предпринять в случае сбоя DAG. -
'retry_delay'— указывает, как долго Airflow должен ждать перед попыткой повторного подключения. -
'project_id'— указывает DAG, с каким идентификатором проекта GCP его следует связать; эта информация понадобится позже при работе с управляемым оператором Apache Spark.
with models.DAG(
'composer_hadoop_tutorial',
schedule_interval=datetime.timedelta(days=1),
default_args=default_dag_args) as dag:
Использование with models.DAG указывает скрипту включить все элементы, расположенные ниже, в тот же DAG. Также мы видим три переданных аргумента:
- Первая переменная, строка, — это имя, которое мы будем присваивать создаваемому DAG. В данном случае мы используем
composer_hadoop_tutorial. -
schedule_interval— объектdatetime.timedelta, для которого здесь установлено значение в один день. Это означает, что данный DAG будет пытаться выполниться один раз в день после'start_date', установленного ранее в'default_dag_args' -
default_args— словарь, созданный нами ранее, содержащий аргументы по умолчанию для DAG.
Создание управляемого кластера Apache Spark
Далее мы создадим объект dataproc_operator.DataprocClusterCreateOperator , который создаст управляемый кластер Apache Spark.
create_dataproc_cluster = dataproc_operator.DataprocClusterCreateOperator(
task_id='create_dataproc_cluster',
cluster_name='composer-hadoop-tutorial-cluster-{{ ds_nodash }}',
num_workers=2,
zone=models.Variable.get('gce_zone'),
master_machine_type='n1-standard-1',
worker_machine_type='n1-standard-1')
В этом операторе мы видим несколько аргументов, все, кроме первого, являются специфичными для этого оператора:
-
task_id— Как и в BashOperator, это имя, которое мы присваиваем оператору, и его можно увидеть в пользовательском интерфейсе Airflow. -
cluster_name— имя, которое мы присваиваем управляемому кластеру Apache Spark. В данном случае мы назвали егоcomposer-hadoop-tutorial-cluster-(см. информационное окно для получения дополнительной информации). -
num_workers— количество рабочих процессов, выделяемых управляемому кластеру Apache Spark. -
zone— географический регион, в котором мы хотим разместить кластер, сохраненный в базе данных Airflow. Для этого будет использоваться переменная'gce_zone'которую мы установили на шаге 3. -
master_machine_type— Тип машины, которую мы хотим выделить для управляемого мастера Apache Spark. -
worker_machine_type— Тип машины, которую мы хотим выделить для управляемого рабочего процесса Apache Spark.
Отправить задание Apache Hadoop
Объект dataproc_operator.DataProcHadoopOperator позволяет отправлять задания в управляемый кластер Apache Spark.
run_dataproc_hadoop = dataproc_operator.DataProcHadoopOperator(
task_id='run_dataproc_hadoop',
main_jar=WORDCOUNT_JAR,
cluster_name='composer-hadoop-tutorial-cluster-{{ ds_nodash }}',
arguments=wordcount_args)
Мы предоставляем несколько параметров:
-
task_id— имя, которое мы присваиваем этому фрагменту DAG. -
main_jar- Расположение файла .jar, который мы хотим запустить в кластере. -
cluster_name— имя кластера, на котором будет выполняться задание. Обратите внимание, что оно идентично тому, что мы видим в предыдущем операторе. -
arguments— аргументы, передаваемые в JAR-файл, как если бы вы запускали JAR-файл из командной строки.
Удалить кластер
Последний оператор, который мы создадим, — это dataproc_operator.DataprocClusterDeleteOperator .
delete_dataproc_cluster = dataproc_operator.DataprocClusterDeleteOperator(
task_id='delete_dataproc_cluster',
cluster_name='composer-hadoop-tutorial-cluster-{{ ds_nodash }}',
trigger_rule=trigger_rule.TriggerRule.ALL_DONE)
Как следует из названия, этот оператор удалит заданный управляемый кластер Apache Spark. Здесь мы видим три аргумента:
-
task_id— Как и в BashOperator, это имя, которое мы присваиваем оператору, и его можно увидеть в пользовательском интерфейсе Airflow. -
cluster_name— имя, которое мы присваиваем управляемому кластеру Apache Spark. В данном случае мы назвали егоcomposer-hadoop-tutorial-cluster-(см. информационное окно после "Создание управляемого кластера Apache Spark" для получения дополнительной информации). -
trigger_rule— Мы кратко упомянули правила запуска во время импорта в начале этого шага, но здесь мы видим одно из них в действии. По умолчанию оператор Airflow не выполняется, пока все его вышестоящие операторы не завершат свою работу успешно. Правило запускаALL_DONEтребует только завершения работы всех вышестоящих операторов, независимо от того, были ли они успешными или нет. В данном случае это означает, что даже если задание Hadoop завершилось с ошибкой, мы все равно хотим остановить кластер.
create_dataproc_cluster >> run_dataproc_hadoop >> delete_dataproc_cluster
Наконец, мы хотим, чтобы эти операторы выполнялись в определенном порядке, и мы можем обозначить это с помощью операторов битового сдвига Python. В этом случае сначала всегда будет выполняться create_dataproc_cluster , затем run_dataproc_hadoop и, наконец, delete_dataproc_cluster .
В итоге, код выглядит так:
# Copyright 2018 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# [START composer_hadoop_tutorial]
"""Example Airflow DAG that creates a Managed Apache Spark cluster, runs the Hadoop
wordcount example, and deletes the cluster.
This DAG relies on three Airflow variables
https://airflow.apache.org/concepts.html#variables
* gcp_project - Google Cloud Project to use for the Managed Apache Spark cluster.
* gce_zone - Google Compute Engine zone where Managed Apache Spark cluster should be
created.
* gcs_bucket - Google Cloud Storage bucket to use for result of Hadoop job.
See https://cloud.google.com/storage/docs/creating-buckets for creating a
bucket.
"""
import datetime
import os
from airflow import models
from airflow.contrib.operators import dataproc_operator
from airflow.utils import trigger_rule
# Output file for Managed Apache Spark job.
output_file = os.path.join(
models.Variable.get('gcs_bucket'), 'wordcount',
datetime.datetime.now().strftime('%Y%m%d-%H%M%S')) + os.sep
# Path to Hadoop wordcount example available on every Managed Apache Spark cluster.
WORDCOUNT_JAR = (
'file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar'
)
# Arguments to pass to Managed Apache Spark job.
input_file = 'gs://pub/shakespeare/rose.txt'
wordcount_args = ['wordcount', input_file, output_file]
yesterday = datetime.datetime.combine(
datetime.datetime.today() - datetime.timedelta(1),
datetime.datetime.min.time())
default_dag_args = {
# Setting start date as yesterday starts the DAG immediately when it is
# detected in the Cloud Storage bucket.
'start_date': yesterday,
# To email on failure or retry set 'email' arg to your email and enable
# emailing here.
'email_on_failure': False,
'email_on_retry': False,
# If a task fails, retry it once after waiting at least 5 minutes
'retries': 1,
'retry_delay': datetime.timedelta(minutes=5),
'project_id': models.Variable.get('gcp_project')
}
# [START composer_hadoop_schedule]
with models.DAG(
'composer_hadoop_tutorial',
# Continue to run DAG once per day
schedule_interval=datetime.timedelta(days=1),
default_args=default_dag_args) as dag:
# [END composer_hadoop_schedule]
# Create a Managed Apache Spark cluster.
create_dataproc_cluster = dataproc_operator.DataprocClusterCreateOperator(
task_id='create_dataproc_cluster',
# Give the cluster a unique name by appending the date scheduled.
# See https://airflow.apache.org/code.html#default-variables
cluster_name='composer-hadoop-tutorial-cluster-{{ ds_nodash }}',
num_workers=2,
zone=models.Variable.get('gce_zone'),
master_machine_type='n1-standard-1',
worker_machine_type='n1-standard-1')
# Run the Hadoop wordcount example installed on the Managed Apache Spark cluster
# master node.
run_dataproc_hadoop = dataproc_operator.DataProcHadoopOperator(
task_id='run_dataproc_hadoop',
main_jar=WORDCOUNT_JAR,
cluster_name='composer-hadoop-tutorial-cluster-{{ ds_nodash }}',
arguments=wordcount_args)
# Delete Managed Apache Spark cluster.
delete_dataproc_cluster = dataproc_operator.DataprocClusterDeleteOperator(
task_id='delete_dataproc_cluster',
cluster_name='composer-hadoop-tutorial-cluster-{{ ds_nodash }}',
# Setting trigger_rule to ALL_DONE causes the cluster to be deleted
# even if the Managed Apache Spark job fails.
trigger_rule=trigger_rule.TriggerRule.ALL_DONE)
# [START composer_hadoop_steps]
# Define DAG dependencies.
create_dataproc_cluster >> run_dataproc_hadoop >> delete_dataproc_cluster
# [END composer_hadoop_steps]
# [END composer_hadoop]
5. Загрузите файлы Airflow в облачное хранилище.
Скопируйте DAG в папку /dags
- Сначала откройте Cloud Shell , в котором уже удобно установлен Cloud SDK.
- Клонируйте репозиторий с примерами Python и перейдите в директорию composer/workflows.
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git && cd python-docs-samples/composer/workflows
- Выполните следующую команду, чтобы задать имя папки с DAG-файлами в качестве переменной среды.
DAGS_FOLDER=$(gcloud composer environments describe ${COMPOSER_INSTANCE} \
--location us-central1 --format="value(config.dagGcsPrefix)")
- Выполните следующую команду
gsutil, чтобы скопировать код из руководства в папку /dags, где она создана.
gsutil cp hadoop_tutorial.py $DAGS_FOLDER
Результат будет выглядеть примерно так:
Copying file://hadoop_tutorial.py [Content-Type=text/x-python]... / [1 files][ 4.1 KiB/ 4.1 KiB] Operation completed over 1 objects/4.1 KiB.
6. Использование пользовательского интерфейса Airflow
Для доступа к веб-интерфейсу Airflow с помощью консоли GCP:
|
|
Для получения информации о пользовательском интерфейсе Airflow см. раздел «Доступ к веб-интерфейсу» .
Просмотреть переменные
Заданные вами ранее переменные сохраняются в вашей среде. Вы можете просмотреть переменные, выбрав «Администрирование» > «Переменные» в строке меню пользовательского интерфейса Airflow.

Изучение алгоритмов DAG
Когда вы загружаете файл DAG в папку dags в Cloud Storage, Cloud Composer анализирует файл. Если ошибок не обнаружено, имя рабочего процесса отображается в списке DAG, и рабочий процесс ставится в очередь на немедленное выполнение. Чтобы просмотреть свои DAG, нажмите на кнопку DAG в верхней части страницы.

Нажмите composer_hadoop_tutorial , чтобы открыть страницу с подробными сведениями о DAG. На этой странице представлено графическое отображение задач рабочего процесса и зависимостей.

Теперь на панели инструментов нажмите «Просмотр графика» , а затем наведите курсор мыши на график каждой задачи, чтобы увидеть ее статус. Обратите внимание, что рамка вокруг каждой задачи также указывает на ее статус (зеленая рамка = выполняется; красная = не выполнено и т. д.).

Чтобы повторно запустить рабочий процесс из представления графика :
- В окне Airflow UI Graph View щелкните графический элемент
create_dataproc_cluster. - Нажмите «Очистить» , чтобы сбросить три задачи, а затем нажмите «ОК» для подтверждения.

Вы также можете проверить статус и результаты выполнения рабочего процесса composer-hadoop-tutorial перейдя на следующие страницы консоли GCP:
- Для мониторинга создания и удаления кластеров используются управляемые кластеры Apache Spark . Обратите внимание, что кластер, созданный в ходе рабочего процесса, является временным: он существует только в течение выполнения рабочего процесса и удаляется в рамках последней задачи рабочего процесса.
- Для просмотра или мониторинга задания подсчета слов в Apache Hadoop используйте управляемые задания Apache Spark . Щелкните идентификатор задания, чтобы просмотреть вывод журнала задания.
- Откройте браузер Cloud Storage , чтобы просмотреть результаты подсчета слов в папке
wordcountв созданном вами для этого практического задания сегменте Cloud Storage.
7. Уборка
Чтобы избежать списания средств с вашего счета GCP за ресурсы, использованные в этом практическом занятии:
- (Необязательно) Чтобы сохранить данные, загрузите их из хранилища Cloud Storage для управляемой среды Apache Airflow и из хранилища, созданного вами для этого практического занятия.
- Удалите созданный вами для этого практического занятия сегмент облачного хранилища .
- Удалите сегмент облачного хранилища для данной среды.
- Удалите управляемую среду Apache Airflow . Обратите внимание, что удаление среды не приводит к удалению хранилища для этой среды.
При желании вы также можете удалить проект:
- В консоли GCP перейдите на страницу «Проекты» .
- В списке проектов выберите проект, который хотите удалить, и нажмите «Удалить».
- В поле введите идентификатор проекта, а затем нажмите «Завершить» , чтобы удалить проект.







