SlideShare a Scribd company logo
BigQueryクエリの
処理の流れ
Jordan Tigani
BigQuery Software Engineer
ゴール:BigQueryクエリの一連の処理手順を追う
注:ここに記されたアーキテクチャの内容や役割は、
- すぐ古くなったり
- 詳細は端折られてたり
- いずれ変更されたり*します
*これがBigQueryの大きなメリットです。見えないところでつねに
改善が続けられています
最近のアーキテクチャ改善の例
シャッフルのスループットが4倍に
クラスタサイズが5倍に
クラスタが追加
ディスク保存のフォーマットを変更
(ColumnIOからの置き換え)
ディスク保存のエンコード形式を変更
(耐久性の向上、サイズの縮小)
残念ながら、詳細は紹介できません
クエリを実行してみよう
SELECT language, SUM(views) as views
FROM (
SELECT title, language, MAX(views) as views
FROM [helixdata2:benchmark.Wiki100B]
WHERE REGEXP_MATCH(title, "G.*o.*")
GROUP EACH BY title, language
)
GROUP EACH BY language
ORDER BY views desc
1000億行に対する複雑なクエリ実行時の性能
実行時間:21秒
- 4 TBのデータを読み込み
- 1000億行に対する正規表現の適用
- 278 GBのデータをシャッフル
並列処理しなかったら:
- 4 TBのディスク読み込みに11.6時間(100 MBpsの場合)
- 1000億行の正規表現処理に27時間(1行あたり1 μsecの場合)
- 278 GBのシャッフルに37分(1Gbpsの場合)
curlでクエリを実行する
curl -H "$(python auth.py)" 
-H "Content-Type: application/json" 
-X POST 
-d {'jobReference': { 
'jobId': 'job_1429217599', 
'projectId': 'bigquery-e2e'}, 
'configuration': { 
'query': { 
'query': 'SELECT ...’}}} 
"https://www.googleapis.com/bigquery/v2/projects/bigquery-e2e/jobs"
リクエストの中身は...
POST /bigquery/v2/projects/bigquery-e2e/jobs HTTP/1.1
User-Agent: curl/7.30.0
Host: www.googleapis.com
Accept: */*
Authorization: Bearer <redacted>
Content-Type: application/json
Content-Length: 126
{'jobReference': {'jobId': 'job_1429217599', 'projectId': 'bigquery-e2e'},
'configuration': {'query': {'query': 'SELECT 17'}}}
Client
HTTP
POST
GFE
JSON API
frontendHTTP
JSON
HTTP
BigQuery
API Server
protobuf
gRPC
ジョブの投入
リクエストがBigQueryに届くまで...
GFE
- GoogleネットワークへのHTTP接続を受け付け
- DoS対策
- 一般的なHTTPヘッダの処理
Google API Frontend
- JSONとProtocol Buffer間の変換
- HTTPとStubby/gRPC間の変換
- リクエスト認証
HTTP
POST
クエリジョブの状態変化
HTTP Error
HTTP
OK
OK?
OK?OK?PENDING RUNNING
DONE w/
errorResult
DONE
no
no
no
yes yes
yes
Client
HTTP
POST
GFE
200 OK API
FrontendHTTP
200 OK
HTTP
BigQuery
API Server
protobuf
gRPC
Spanner
新規ジョブ Stubby
ジョブ投入の完了
レスポンスヘッダ
HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Vary: X-Origin
Content-Type: application/json; charset=UTF-8
Server: GSE
Accept-Ranges: none
Vary: Origin,Accept-Encoding
Transfer-Encoding: chunked
レスポンスデータ
{
"kind": "bigquery#job",
"id": "bigquery-e2e:job_1429217599",
"jobReference": {"projectId": "bigquery-e2e", "jobId": "job_1429217599"},
"configuration": {...}
"status": {
"state": "RUNNING"
},
"statistics": {
"creationTime": "1429217642957",
"startTime": "1429217643549"
},
"user_email": "jtigani@gmail.com"
}
レスポンスデータ(configuration)
"configuration": {
"query": {
"query": "SELECT ...",
"destinationTable": {
"projectId": "bigquery-e2e",
"datasetId": "_0e32b38e1117b2fcea992287c138bd53acfff7cc",
"tableId": "anon6163a05d4704b78c589f41813708f340a2df2d1f"
},
"createDisposition": "CREATE_IF_NEEDED",
"writeDisposition": "WRITE_TRUNCATE"
}
}
新しいジョブの開始
1. 確認フェーズ:
- 認証チェック
- クオータのチェック
- 入力内容の検証
- キャッシュのチェック
- 出力テーブルの用意
2. ジョブをメタデータストアに保存
3. リクエスト元に正常開始を伝える
ところで:BigQueryのキャッシュの動き
以下のSHA-1ハッシュ値をとる:
- データ更新時間
- 参照テーブル
以下の場合はキャッシュを使わない:
- 値が変化する関数を使用(NOW()など)
- 固定の出力テーブルを指定
- 参照テーブルがストリーミングバッファを使用
SHA-1ハッシュ値が出力テーブル名となる
ユーザー単位でキャッシュされる
BigQuery
APIサーバ
Spanner
テーブル
メタデータ
Dremel ゲー
トウェイ
Dremel
クエリ Dremelクラスタ
us-central-1-a
Dremelクラスタ
us-central-2-a
Dremel
クエリ
Dremelクエリの開始
Dremelゲートウェイ
アクセス可能なレプリカを検索
以下に基づき、クエリの実行に最適な場所を決定:
- データからの距離
- クラスタの負荷状況
データは部分的にレプリケーションされる場合もある
ところで:BigQueryのレプリケーション
地理的に離れた複数のゾーン間でレプリケーション
- 可用性の向上
- ディザスタリカバリ
データセンター内でのレプリケーション
- 永続性の向上
- リード性能の向上
- リードソロモンに似たエンコーディングを使用
小さなテーブルはメタデータ内に保存
ところで:BigQueryのStreaming insert
Streaming insertされたデータはBigtable上にバッファ
ワーカによって定期的にColossusに保存
Dremelクエリ実行時はBigtable上のバッファも読み込み
バッファ内容はdurableだが、大きな障害時には一時的に読み
込みできなくなる
Dremel ゲー
トウェイ
Dremel Root
Mixer
Dremel
クエリ
Dremel
Mixer-1
Dremel
Mixer-1
Dremel
Mixer-1
Dremel
Shard
Dremel
Shard
Dremel
Shard
Dremel
Shard
Dremel
Shard
Dremel
Shard
Dremelクエリの実行ツリー
Dremel Root Mixer
クエリプランの構築
- クエリを複数のステージに分割
- 処理内容を並列タスクに分割
クエリのスケジューリング
- 利用可能なスロットを各ユーザーに分配
- クエリの割り込み
クエリを下位のmixer/shardに転送
Dremel Shard
実行中のクエリの一部分を実行
ソースからデータを読み込み
通常はColossusから
(Streaming時の)Bigtable、またはCloud Storage
集約処理を部分的に実行
Dremel
Shard
Dremel
Shard
Dremel
Shard
CFS CFS CFS CFS CFS CFS
分散メタデータ
分散ファイル
分散
ストレージ
データの読み込み
Streaming
BigTable
ストレージ階層
Colossusメタデータ
- ディレクトリ構造
- ACLs
Colossusファイル
- ほとんどフラットな構造
- 一部のACLs
- 暗号化
分散ストレージ
- ディスクエンコード(RAID的なもの)
- クラスタ内でレプリケーション
カラムストレージ
ColumnIO
データを行単位ではなくカラム単位で保存
圧縮効率が向上
分散ファイルシステムを利用
- ローカルディスクではシークが多すぎる
不要なカラムをスキップ
- クエリの多くはテーブル内の一部のカラムのみ参照
制約ヘッダ
- 各カラムのレンジとカーディナリティを保持
- ファイルのスキップが可能に
Dremel
Shard
CFS CFS CFS CFS
WHERE
REGEXP_MATCH(
title, "G.*o.")
フィルタリングの実行
CFSCFS
Drmel
Shard
Dremel
Shard
Dremel
Shard
Dremel
Shard
データのシャッフル
Dremel
Shard
Dremel
Shard
Dremel
Shard
データのシャッフル
ハッシュ値でデータをパーティション分割
- 個々のshardで集約が可能
大きなパーティションはディスクにあふれる
パーティションのばらつきも起こりうる
- 例:3億のユニークユーザーIDのうち10%がユーザーID=0
Dremel
Shard
Dremel
Shard
Dremel
Shard
CFS CFS CFS CFSr CFS CFS
データのマテリアライズ
結果の出力
シャッフルした結果はshardに出力
- shard内で集約されたデータ
- 大規模な結果も出力可能
シャッフル不要の結果はmixerに返す
- mixerで集約を実行
- 出力可能なサイズは128MBまで
BigQuery
APIサーバ
Spanner
テーブル
メタデータ
Dremel ゲー
トウェイ
クエリス
テータス Dremelクラスタ
us-central-1-a
クエリス
テータス
クエリ結果の保存
クエリ結果の保存
保存処理はACID特性を持つ
- クエリ結果はすべてが返されるか、全く返されないか
- クエリ結果は次のクエリですぐ利用できる
小さなクエリ結果はメタデータ内部に保存される
保存時に以下も可能:
- CREATE_IF_NEEDED指定時のテーブル作成
- WRITE_TRUNCATE指定時のテーブルまるめ
- ジョブのステータスをDONEに
jobs.
getQueryResu
lts()
GFE
APIフロ
ントエン
ド
BigQuery
APIサーバ
Spanner
ジョブ
結果のポーリング
結果のポーリング
jobs.getQueryResults()
- サーバ側でGETをホールド
- Jobs.insert()のジョブIDを指定
- ジョブステータス=DONEを待つ
- タイムアウトしたらリトライ
1回に1ページごと結果を返す
curlでクエリ結果を取得
RESULTS_URL=${JOBS_URL}/${JOB_ID}/results
curl -H "$(python auth.py)" 
-H "Content-Type: application/json" 
-X GET 
"${RESULTS_URL}"
Questions?
Thank you!
Contact info:
e-mail: tigani@google.com
twitter: @jrdntgn
g+: +JordanTigani

More Related Content

PDF
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
PDF
TVM の紹介
PDF
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
PDF
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PDF
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
PDF
BigQuery で 150万円 使ったときの話
PPTX
MLflowで学ぶMLOpsことはじめ
PDF
分散学習のあれこれ~データパラレルからモデルパラレルまで~
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
TVM の紹介
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
BigQuery で 150万円 使ったときの話
MLflowで学ぶMLOpsことはじめ
分散学習のあれこれ~データパラレルからモデルパラレルまで~

What's hot (20)

PPTX
[DL輪読会]“SimPLe”,“Improved Dynamics Model”,“PlaNet” 近年のVAEベース系列モデルの進展とそのモデルベース...
PDF
Spannerに関する技術メモ
PDF
MySQL勉強会 クエリチューニング編
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
PDF
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
PDF
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
PDF
リクルートのビッグデータ活用基盤とビッグデータ活用のためのメタデータ管理Webのご紹介
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PDF
TRICK 2022 Results
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
PDF
メルカリ・ソウゾウでは どうGoを活用しているのか?
PDF
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
PPTX
GraphQLのsubscriptionで出来ること
PPTX
近年のHierarchical Vision Transformer
PDF
ChatGPT 人間のフィードバックから強化学習した対話AI
PDF
ストリーム処理を支えるキューイングシステムの選び方
PDF
CUDAプログラミング入門
PDF
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
PPTX
Redshift勉強会
PPTX
やってはいけない空振りDelete
[DL輪読会]“SimPLe”,“Improved Dynamics Model”,“PlaNet” 近年のVAEベース系列モデルの進展とそのモデルベース...
Spannerに関する技術メモ
MySQL勉強会 クエリチューニング編
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
リクルートのビッグデータ活用基盤とビッグデータ活用のためのメタデータ管理Webのご紹介
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
TRICK 2022 Results
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
メルカリ・ソウゾウでは どうGoを活用しているのか?
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
GraphQLのsubscriptionで出来ること
近年のHierarchical Vision Transformer
ChatGPT 人間のフィードバックから強化学習した対話AI
ストリーム処理を支えるキューイングシステムの選び方
CUDAプログラミング入門
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
Redshift勉強会
やってはいけない空振りDelete
Ad

Similar to Google BigQuery クエリの処理の流れ - #bq_sushi (20)

PDF
Java 10でぼくたちの生活はどう変わるの?
PPT
プロとしてのOracleアーキテクチャ入門 ~番外編~
PDF
[D37]MySQLの真のイノベーションはこれだ!MySQL 5.7と「実験室」 by Ryusuke Kajiyama
PPTX
BigQuery Query Optimization クエリ高速化編
PDF
Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出
PDF
Lt agetsuma 拡大するcdi
PDF
性能問題を起こしにくい 強いDBシステムの作り方(Ver. 2018.9)
PDF
Elastic 7.13-new-features-20210624
PPTX
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
PPTX
20120822_dstn技術交流会_dstnのご紹介と最新技術情報
PDF
今年はJava進化の年!今知っておくべき新しいJava
PPTX
20190124_hccjp_recochoku_40m_pub
PPTX
Metaspace
PDF
MySQL 8.0で強化されたGIS機能のご紹介:「FOSS4G 2018 Hokkaido」での発表資料
PDF
20180706_VxRailCC_ワークショップ編_NW
PDF
Elastic7.10 newfeaturesintroduce 1216
PDF
10
PDF
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
PDF
Autonomous を支える技術、Oracle Database 18c デモンストレーション
PDF
今秋リリース予定のPostgreSQL11を徹底解説
Java 10でぼくたちの生活はどう変わるの?
プロとしてのOracleアーキテクチャ入門 ~番外編~
[D37]MySQLの真のイノベーションはこれだ!MySQL 5.7と「実験室」 by Ryusuke Kajiyama
BigQuery Query Optimization クエリ高速化編
Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出
Lt agetsuma 拡大するcdi
性能問題を起こしにくい 強いDBシステムの作り方(Ver. 2018.9)
Elastic 7.13-new-features-20210624
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
20120822_dstn技術交流会_dstnのご紹介と最新技術情報
今年はJava進化の年!今知っておくべき新しいJava
20190124_hccjp_recochoku_40m_pub
Metaspace
MySQL 8.0で強化されたGIS機能のご紹介:「FOSS4G 2018 Hokkaido」での発表資料
20180706_VxRailCC_ワークショップ編_NW
Elastic7.10 newfeaturesintroduce 1216
10
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
Autonomous を支える技術、Oracle Database 18c デモンストレーション
今秋リリース予定のPostgreSQL11を徹底解説
Ad

More from Google Cloud Platform - Japan (20)

PDF
ServerlessDays Tokyo 2022 Virtual.pdf
PDF
20221105_GCPUG 女子会 Kubernets 編.pdf
PDF
Google Cloud でアプリケーションを動かす.pdf
PDF
[External] 2021.12.15 コンテナ移行の前に知っておきたいこと @ gcpug 湘南
PDF
What’s new in cloud run 2021 後期
PDF
【Dialogflow cx】はじめてみよう google cloud dialogflow cx 編
PDF
Google Cloud で実践する SRE
PDF
[Cloud OnAir] 事例紹介 : 株式会社マーケティングアプリケーションズ 〜クラウドへのマイグレーションとその後〜 2020年12月17日 放送
PDF
[Cloud OnAir] 【実演】Google Cloud VMware Engine と VMware ソリューションを組み合わせたハイブリッド環境の...
PDF
[Cloud OnAir] Google Workspace でできる データ分析と業務自動化のご紹介 2020年12月3日 放送
PDF
[Cloud OnAir] Google Cloud へのマイグレーション ツールの紹介 2020年11月26日 放送
PDF
[Cloud OnAir] Google Cloud における RDBMS の運用パターン 2020年11月19日 放送
PDF
[Cloud OnAir] 事例紹介: 株式会社オープンハウス 〜Google サービスを活用したオープンハウスの AI の取り組み〜 2020年11月1...
PDF
[Cloud OnAir] 【Anthos 演習】 解説を聞きながら Anthos を体験しよう 2020年11月5日 放送
PDF
[Cloud OnAir] 【Google Kubernetes Engine 演習】解説を聞きながら GKE を体験しよう 2020年10月29日 放送
PDF
[Cloud OnAir] Google Cloud の AI / IoT 最新事例紹介 2020年10月22日 放送
PDF
[Cloud OnAir] Google Cloud Next '20: OnAir 特別編 〜世界で人気のあったセッション特集〜 2020年9月24日 放送
PDF
[Cloud OnAir] Talks by DevRel Vol.5 アプリケーションのモダナイゼーション 2020年9月3日 放送
PDF
明日から役立つ BigQuery ML 活用 5 つのヒント | Google Cloud INSIDE Games & Apps: Online
PDF
今だから知りたい BigQuery 再入門 | Google Cloud INSIDE Games & Apps: Online
ServerlessDays Tokyo 2022 Virtual.pdf
20221105_GCPUG 女子会 Kubernets 編.pdf
Google Cloud でアプリケーションを動かす.pdf
[External] 2021.12.15 コンテナ移行の前に知っておきたいこと @ gcpug 湘南
What’s new in cloud run 2021 後期
【Dialogflow cx】はじめてみよう google cloud dialogflow cx 編
Google Cloud で実践する SRE
[Cloud OnAir] 事例紹介 : 株式会社マーケティングアプリケーションズ 〜クラウドへのマイグレーションとその後〜 2020年12月17日 放送
[Cloud OnAir] 【実演】Google Cloud VMware Engine と VMware ソリューションを組み合わせたハイブリッド環境の...
[Cloud OnAir] Google Workspace でできる データ分析と業務自動化のご紹介 2020年12月3日 放送
[Cloud OnAir] Google Cloud へのマイグレーション ツールの紹介 2020年11月26日 放送
[Cloud OnAir] Google Cloud における RDBMS の運用パターン 2020年11月19日 放送
[Cloud OnAir] 事例紹介: 株式会社オープンハウス 〜Google サービスを活用したオープンハウスの AI の取り組み〜 2020年11月1...
[Cloud OnAir] 【Anthos 演習】 解説を聞きながら Anthos を体験しよう 2020年11月5日 放送
[Cloud OnAir] 【Google Kubernetes Engine 演習】解説を聞きながら GKE を体験しよう 2020年10月29日 放送
[Cloud OnAir] Google Cloud の AI / IoT 最新事例紹介 2020年10月22日 放送
[Cloud OnAir] Google Cloud Next '20: OnAir 特別編 〜世界で人気のあったセッション特集〜 2020年9月24日 放送
[Cloud OnAir] Talks by DevRel Vol.5 アプリケーションのモダナイゼーション 2020年9月3日 放送
明日から役立つ BigQuery ML 活用 5 つのヒント | Google Cloud INSIDE Games & Apps: Online
今だから知りたい BigQuery 再入門 | Google Cloud INSIDE Games & Apps: Online

Google BigQuery クエリの処理の流れ - #bq_sushi