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

1. Введение

1c05e3d0c2bd2b45.png74be7b376d45258a.png

Рабочие процессы – это полностью управляемая служба оркестрации, которая выполняет Google Cloud или внешние службы в заданном вами порядке.

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

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

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

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

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

Самостоятельная настройка среды

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

Запустить Cloud Shell

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

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

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

Перейдите в раздел BigQuery в Google Cloud Console:

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. Определите рабочий процесс для выполнения нескольких запросов.

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

Внутри 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 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 :

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 раз.