Запуск заданий BigQuery параллельно с рабочими процессами

1. Введение

1c05e3d0c2bd2b45.png74be7b376d45258a.png

Workflows — это полностью управляемый сервис оркестровки, который выполняет операции в Google Cloud или внешних сервисах в том порядке, который вы зададите.

BigQuery — это полностью управляемое корпоративное хранилище данных, которое помогает управлять и анализировать терабайты данных благодаря встроенным функциям, таким как машинное обучение, геопространственный анализ и бизнес-аналитика.

В этом практическом занятии вы выполните несколько запросов BigQuery к общедоступному набору данных Википедии. Затем вы увидите, как выполнять несколько запросов BigQuery последовательно, в рамках оркестрации рабочих процессов. Наконец, вы распараллелите запросы, используя функцию параллельной итерации рабочих процессов, что позволит увеличить скорость до 5 раз.

Что вы узнаете

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

2. Настройка и требования

Настройка среды для самостоятельного обучения

  1. Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.

В консоли Google Cloud нажмите на значок Cloud Shell на панели инструментов в правом верхнем углу:

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

3. Изучите набор данных Википедии.

Для начала изучите набор данных Википедии в BigQuery.

Перейдите в раздел BigQuery в консоли Google Cloud:

ea75ab12a7c012a4.png

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

c9484e305b8e1438.png

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

c540a4162640cbb3.png

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

b5b2a334cd6f63c0.png

Вы также можете выполнять запросы к таблице. Например, этот запрос выбирает 100 заголовков с наибольшим количеством просмотров:

SELECT TITLE, SUM(views)
FROM bigquery-samples.wikipedia_pageviews.201207h
GROUP BY TITLE
ORDER BY SUM(VIEWS) DESC
LIMIT 100

После выполнения запроса загрузка данных занимает около 20 секунд:

1df3877aed1653b4.png

4. Определите рабочий процесс для выполнения нескольких запросов.

Выполнить запрос к одной таблице легко. Однако выполнение нескольких запросов к нескольким таблицам и объединение результатов может стать довольно утомительным. В этом вам поможет Workflows со своим синтаксисом итераций !

Внутри Cloud Shell создайте файл workflow-serial.yaml для построения рабочего процесса, выполняющего несколько запросов к нескольким таблицам:

touch workflow-serial.yaml

Затем вы можете отредактировать файл с помощью редактора в Cloud Shell:

33bf9325b078ad8.png

В файле 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 :

b6afa4747680334f.png

В качестве альтернативы вы также можете запустить рабочий процесс с помощью gcloud в Cloud Shell:

gcloud workflows run bigquery-serial

Вы должны увидеть, что выполнение рабочего процесса займет около 1 минуты (20 секунд для каждой из 5 таблиц).

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

304d11a5bffdada4.png

baf31533d3671c9e.png

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 раз всего за пару строк кода!

В итоге вы увидите одинаковый результат для каждой таблицы с самыми популярными заголовками и представлениями, но со значительно меньшим временем выполнения:

1825d49ef225c828.png

7. Поздравляем!

Поздравляем, вы завершили практическое занятие! ​​Чтобы узнать больше, ознакомьтесь с документацией по рабочим процессам, посвященной параллельным шагам .

Что мы рассмотрели

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