1. Введение


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



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

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

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

В разделе 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. Определите рабочий процесс для выполнения нескольких запросов.
Выполнить запрос к одной таблице легко. Однако выполнение нескольких запросов к нескольким таблицам и сопоставление результатов может оказаться довольно утомительным. Чтобы помочь в этом, рабочие процессы могут помочь с синтаксисом итерации !
Внутри 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 Console или с помощью 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 раз.