1. Введение


Workflows — это полностью управляемый сервис оркестровки, который выполняет операции в Google Cloud или внешних сервисах в том порядке, который вы зададите.
BigQuery — это полностью управляемое корпоративное хранилище данных, которое помогает управлять и анализировать терабайты данных благодаря встроенным функциям, таким как машинное обучение, геопространственный анализ и бизнес-аналитика.
В этом практическом занятии вы выполните несколько запросов BigQuery к общедоступному набору данных Википедии. Затем вы увидите, как выполнять несколько запросов BigQuery последовательно, в рамках оркестрации рабочих процессов. Наконец, вы распараллелите запросы, используя функцию параллельной итерации рабочих процессов, что позволит увеличить скорость до 5 раз.
Что вы узнаете
- Как выполнять запросы BigQuery к набору данных Википедии.
- Как последовательно выполнять несколько запросов в рамках оркестрации рабочих процессов.
- Как распараллелить запросы с помощью параллельной итерации в рабочих процессах для повышения скорости до 5 раз.
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .



- Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы можете изменить её в любое время.
- Идентификатор проекта должен быть уникальным для всех проектов Google Cloud и неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор проекта (обычно он обозначается как
PROJECT_ID). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он останется неизменным на протяжении всего проекта. - К вашему сведению, существует третье значение — номер проекта , который используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
- Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить весь проект. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .
Запустить Cloud Shell
Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.
В консоли Google Cloud нажмите на значок Cloud Shell на панели инструментов в правом верхнем углу:

Подготовка и подключение к среде займут всего несколько минут. После завершения вы должны увидеть что-то подобное:

Эта виртуальная машина содержит все необходимые инструменты разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Вся работа в этом практическом задании может выполняться в браузере. Вам не нужно ничего устанавливать.
3. Изучите набор данных Википедии.
Для начала изучите набор данных Википедии в BigQuery.
Перейдите в раздел BigQuery в консоли Google Cloud:

В папке bigquery-samples вы увидите различные общедоступные наборы данных, в том числе некоторые наборы данных, связанные с Википедией:

В наборе данных wikipedia_pageviews можно увидеть различные таблицы с данными о просмотрах страниц за разные годы:

Вы можете выбрать одну из таблиц (например, 201207 ) и просмотреть данные:

Вы также можете выполнять запросы к таблице. Например, этот запрос выбирает 100 заголовков с наибольшим количеством просмотров:
SELECT TITLE, SUM(views) FROM bigquery-samples.wikipedia_pageviews.201207h GROUP BY TITLE ORDER BY SUM(VIEWS) DESC LIMIT 100
После выполнения запроса загрузка данных занимает около 20 секунд:

4. Определите рабочий процесс для выполнения нескольких запросов.
Выполнить запрос к одной таблице легко. Однако выполнение нескольких запросов к нескольким таблицам и объединение результатов может стать довольно утомительным. В этом вам поможет Workflows со своим синтаксисом итераций !
Внутри Cloud Shell создайте файл workflow-serial.yaml для построения рабочего процесса, выполняющего несколько запросов к нескольким таблицам:
touch workflow-serial.yaml
Затем вы можете отредактировать файл с помощью редактора в Cloud Shell:

В файле workflow-serial.yaml на первом шаге init создайте карту results , чтобы отслеживать каждую итерацию, используя в качестве ключей имена таблиц. Также определите массив tables со списком таблиц, к которым вы хотите выполнять запросы. В данном случае мы выбираем 5 таблиц:
main:
steps:
- init:
assign:
- results : {}
- tables:
- 201201h
- 201202h
- 201203h
- 201204h
- 201205h
Далее определите шаг runQueries . Этот шаг перебирает каждую таблицу и использует коннектор BigQuery Workflows для выполнения запроса, чтобы найти 100 заголовков с наибольшим количеством просмотров страниц в каждой таблице. Затем он сохраняет заголовок и количество просмотров из каждой таблицы в карте результатов:
- runQueries:
for:
value: table
in: ${tables}
steps:
- runQuery:
call: googleapis.bigquery.v2.jobs.query
args:
projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
body:
useLegacySql: false
useQueryCache: false
timeoutMs: 30000
# Find the top 100 titles with most views on Wikipedia
query: ${
"SELECT TITLE, SUM(views)
FROM `bigquery-samples.wikipedia_pageviews." + table + "`
WHERE LENGTH(TITLE) > 10
GROUP BY TITLE
ORDER BY SUM(VIEWS) DESC
LIMIT 100"
}
result: queryResult
- returnResult:
assign:
# Return the top title from each table
- results[table]: {}
- results[table].title: ${queryResult.rows[0].f[0].v}
- results[table].views: ${queryResult.rows[0].f[1].v}
На заключительном этапе верните карту results :
- returnResults:
return: ${results}
5. Выполняйте несколько запросов с помощью рабочих процессов.
Прежде чем развертывать и запускать рабочий процесс, необходимо убедиться, что API рабочих процессов включен. Вы можете включить его в консоли Google Cloud или с помощью gcloud в Cloud Shell:
gcloud services enable workflows.googleapis.com
Создайте учетную запись службы для рабочих процессов:
SERVICE_ACCOUNT=workflows-bigquery-sa gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name="Workflows BigQuery service account"
Убедитесь, что у учетной записи службы есть необходимые роли для регистрации и запуска заданий BigQuery:
PROJECT_ID=your-project-id gcloud projects add-iam-policy-binding $PROJECT_ID \ --role roles/logging.logWriter \ --role roles/bigquery.jobUser \ --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
Разверните рабочий процесс с использованием учетной записи службы:
gcloud workflows deploy bigquery-serial \
--source=workflow-serial.yaml \
--service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
Наконец, вы готовы запустить рабочий процесс.
Найдите рабочий процесс bigquery-serial в разделе «Рабочие процессы» в Cloud Console и нажмите кнопку Execute :

В качестве альтернативы вы также можете запустить рабочий процесс с помощью gcloud в Cloud Shell:
gcloud workflows run bigquery-serial
Вы должны увидеть, что выполнение рабочего процесса займет около 1 минуты (20 секунд для каждой из 5 таблиц).
В итоге вы увидите результаты из каждой таблицы с указанием основных заголовков и представлений:


6. Параллельная обработка нескольких запросов с помощью параллельных шагов.
Рабочий процесс на предыдущем шаге занял около 1 минуты, поскольку он выполнил 5 запросов, каждый из которых длился 20 секунд. Так как это независимые запросы, вы можете выполнять их параллельно, используя функцию параллельной итерации в рабочих процессах.
Скопируйте файл workflow-serial.yaml в новый файл workflow-parallel.yaml . В новом файле вам нужно будет внести несколько изменений, чтобы преобразовать последовательные шаги в параллельные.
В файле workflow-parallel.yaml измените шаг runQueries . Во-первых, добавьте ключевое слово parallel . Это позволит выполнять каждую итерацию цикла for параллельно. Во-вторых, объявите переменную results как shared переменную. Это позволит записывать данные в эту переменную из любой ветви. Мы будем добавлять каждый результат в эту переменную.
- runQueries:
parallel:
shared: [results]
for:
value: table
in: ${tables}
Разверните параллельный рабочий процесс:
gcloud workflows deploy bigquery-parallel \
--source=workflow-parallel.yaml \
--service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
Запустите рабочий процесс:
gcloud workflows run bigquery-parallel
Вы должны увидеть, что выполнение рабочего процесса занимает около 20 секунд. Это связано с тем, что все 5 запросов выполняются параллельно. Увеличение скорости до 5 раз всего за пару строк кода!
В итоге вы увидите одинаковый результат для каждой таблицы с самыми популярными заголовками и представлениями, но со значительно меньшим временем выполнения:

7. Поздравляем!
Поздравляем, вы завершили практическое занятие! Чтобы узнать больше, ознакомьтесь с документацией по рабочим процессам, посвященной параллельным шагам .
Что мы рассмотрели
- Как выполнять запросы BigQuery к набору данных Википедии.
- Как последовательно выполнять несколько запросов в рамках оркестрации рабочих процессов.
- Как распараллелить запросы с помощью параллельной итерации в рабочих процессах для повышения скорости до 5 раз.