1. はじめに

Workflows は、定義した順序で Google Cloud サービスまたは外部サービスを実行するフルマネージドのオーケストレーション サービスです。
BigQuery は、ML、地理空間分析、ビジネス インテリジェンスなどの組み込み機能を使用してテラバイト単位のデータの管理と分析を支援する、フルマネージドのエンタープライズ データ ウェアハウスです。
この Codelab では、一般公開の Wikipedia データセットに対して BigQuery クエリを実行します。次に、Workflows オーケストレーションの一部として、複数の BigQuery クエリを順次実行する方法について説明します。最後に、Workflows の並列反復処理機能を使用してクエリを並列化し、最大 5 倍の速度向上を実現します。
学習内容
- Wikipedia データセットに対して BigQuery クエリを実行する方法。
- Workflows オーケストレーションの一部として複数のクエリを順次実行する方法。
- Workflows の並列イテレーションを使用してクエリを並列化し、最大 5 倍の速度向上を実現する方法。
2. 設定と要件
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。



- プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。この設定はいつでも変更できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は
PROJECT_IDと識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。 - なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクト全体を削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Shell の起動
Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。
Google Cloud Console で、右上のツールバーにある Cloud Shell アイコンをクリックします。

プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。この Codelab での作業はすべて、ブラウザ内から実行できます。インストールは不要です。
3. Wikipedia データセットを調べる
まず、BigQuery で Wikipedia データセットを探索します。
Google Cloud コンソールの BigQuery セクションに移動します。

bigquery-samples には、Wikipedia 関連のデータセットを含むさまざまな一般公開データセットが表示されます。

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 ステップを定義します。このステップでは、各テーブルを反復処理し、Workflows の BigQuery コネクタを使用してクエリを実行し、各テーブルでページビューが最も多い上位 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. Workflows で複数のクエリを実行する
ワークフローをデプロイして実行する前に、Workflows API が有効になっていることを確認する必要があります。Google Cloud Console から有効にするか、Cloud Shell で gcloud を使用して有効にできます。
gcloud services enable workflows.googleapis.com
Workflows のサービス アカウントを作成します。
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
これで、ワークフローを実行する準備が整いました。
Cloud Console の [ワークフロー] セクションで bigquery-serial ワークフローを見つけて、Execute ボタンをクリックします。

または、Cloud Shell で gcloud を使用してワークフローを実行することもできます。
gcloud workflows run bigquery-serial
ワークフローの実行が約 1 分間(5 つのテーブルそれぞれに 20 秒)続きます。
最後に、各テーブルの出力と上位のタイトルとビューが表示されます。


6. 並列ステップを使用して複数のクエリを並列化する
前の手順のワークフローでは、それぞれ 20 秒かかる 5 つのクエリを実行したため、約 1 分かかりました。これらは独立したクエリであるため、Workflows の並列反復処理機能を使用して並列で実行できます。
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. 完了
お疲れさまでした。これでこの Codelab は終了です。詳細については、並列ステップに関する Workflows のドキュメントをご覧ください。
学習した内容
- Wikipedia データセットに対して BigQuery クエリを実行する方法。
- Workflows オーケストレーションの一部として複数のクエリを順次実行する方法。
- Workflows の並列イテレーションを使用してクエリを並列化し、最大 5 倍の速度向上を実現する方法。