SlideShare a Scribd company logo
confidential
Mobility Technologies Co., Ltd.
BigQuery Query Optimization (公開版)
AIシステム部 データサイエンスグループ 老木 智章
2020/05/19
confidential
Mobility Technologies Co., Ltd.
BigQueryを触ったエンジニアの誰もが考える。
「もうちょっとこれ速くならないかな・・・」
が、そのよくわからん挙動に「まあ待てばいいか」と多くの人が涙を飲んできた。
(実際は速いのであまり速さで困ることはない)
だが、単純に書かれたBigQueryには十分に高速化の余地がある。
本スライドは読者にBigQueryの速度最適化に取り組む手がかりを提供する。
ゴール:
- BigQueryのアーキテクチャがわかるようになる
- クエリのプロファイリングができるようになる
- クエリの高速化の具体例を知る (数倍レベルで速くなりうる)
概要
confidential
Mobility Technologies Co., Ltd.
 本資料は2019/11に出版された「Google BigQuery: The Definitive Guide」を主な情報源にして
いる
 BigQueryはインターネットをさらっても、まとまった情報を得るのが難しい
 日本語でいい本はパッと見つけられなかった
参考資料
3
表紙画像引用元 https://www.oreilly.com/library/view/google-bigquery-the/9781492044451/
confidential
Mobility Technologies Co., Ltd.
BQのアーキテクチャ
4
01
confidential
Mobility Technologies Co., Ltd.
BigQueryはSQLをインターフェイスとした、分散コンピューティング基盤である。
SQLで記述したジョブをいい感じに分割し、多数のノードに処理を分散してくれる。
生徒の成績が入ったテーブルで成績を合計する場合は、2個のコンテナが立ち上がり、それぞれ成績
の一部を合計する。その後に、2つの結果を足し合わせると全体の合計が得られる。
このような、自動的な処理の分散を行ってくれるのがBQの優れた点である。
BigQueryの大雑把な概念
5
生
徒
名
成
績
生
徒
名
成
績
container1 container2
テーブルの列ごとに複数のファイ
ルに分割して保存されている
SELECT
SUM(score)
FROM students
confidential
Mobility Technologies Co., Ltd.
BigQueryではSQLはStageという処理単位に分割されて実行される。
各stageは並列して実行可能。
以下の例ではCOUNT演算を二つのstageに分割して実行している。
SQLの実行モデル
6
SELECT COUNT(*) as c
FROM
`bigquery-public-
data.new_york_taxi_trips.tlc_yellow_trips_2017`
WHERE passenger_count > 5
各stageはさらにShardという実行可能タスクに分割され実行される。
S00ステージは、9つのshardに分割されている。
各shardでは、9分の1のデータずつCOUNT処理を行う。
S01ステージでは、上記shardの9個の出力を合計している。
confidential
Mobility Technologies Co., Ltd.
ShardはBorgと呼ばれるコンテナ実行エンジンで実行される。
shardは実行時にSchedulerからSlotを割り当てられて実行される。
1 slotはCPUのコアの半分と、1GBのRAMで構成される。
1つのshardは1つのslotで実行される。
Shardの実行モデル
7
各shardは、
• 前のstageの一部が完了して
• Slotに空きができる
と実行され、実行結果をShuffleFS (基本的に
インメモリ)に書き込む。
図はGoogle BigQuery The Definitive Guideより引用
confidential
Mobility Technologies Co., Ltd.
 使えるSlot数の上限はプロジェクトの契約形態による
 オンデマンド契約であればプロジェクトあたり同時実行スロット数 2000 (上限突破しうる)
 下のオレンジの線がリミットだが上限突破している
 定額プランなら契約次第
 MonitoringツールからプロジェクトのSlot利用量を確認することができる。
 下図はMonitoringツール
Slotの上限
8
confidential
Mobility Technologies Co., Ltd.
ShardとSink
9
Shardの処理結果はShuffleFSにSinkと呼ばれる単位で書き込まれている。
「クラスごとに男子の平均点を計算する」クエリを考える。
Stage1で男子だけ抽出するフィルター処理、Stage2でクラスごとに集計する処理が行われる。
Stage1は、1番目のSinkにクラスAの男子のスコアを、2番目のSinkにクラスBの男子のスコアを
という風に、次のStageで必要となる単位に応じて出力先を振り分ける。
SELECT
class_id,
AVG(score)
FROM all_scores
WHERE sex = ‘male’
GROUP BY class_id
実際には、一つのSinkに複数クラスのスコアを入れる
ため、Sinkの数とクラス数は一対一対応ではない。
Sink数は、BQが謎のアルゴリズムで決定する。
図はGoogle BigQuery The Definitive Guideより引用
confidential
Mobility Technologies Co., Ltd.
 BigQueryはSQLをStageに分割し、さらにStageはShardに分割される
 Shardはコンテナエンジンで並列実行される
 ShardはSinkと呼ばれる単位で結果を出力する
まとめ
10
confidential
Mobility Technologies Co., Ltd.
クエリのプロファイリング
11
02
confidential
Mobility Technologies Co., Ltd.
最適化では、実行時間の測定とプロファイリングを行う。
 実行時間の測定
 短くしたい対象の処理時間を計測する (今回はクエリの実行時間)
 測定結果にはばらつきがあるので、必ず複数回計測し平均か中央値をとる
 2割ぐらいは平気でばらつく
 クエリ文が同一だとキャッシュが聞くため、キャッシュをoffにすること
 プロジェクト内でslot消費が激しいクエリが他に走っていると、かなり遅くなる
 プロファイリング
 クエリのうち処理が重いのは一部分であることが多いので、そこを特定する作業
 処理が重い部分がわかれば8割勝ってる
実行時間の測定とプロファイリング
12
confidential
Mobility Technologies Co., Ltd.
BQの最適化において直感で効率が悪い箇所を発見するのは不可能。
クエリがどうstageに分割されるかや、どのstageが重いかは人類の直感を超える。
そこで、プロファイル情報を取得することで、クエリのボトルネックを同定する。
BQのクエリエディタにもプロファイル情報が乗っているが情報が少なく見づらい。
クエリのプロファイリング
13
BQクエリエディタ付属の
プロファイル情報 →
confidential
Mobility Technologies Co., Ltd.
bq show --format=prettyjson -j (ジョブID)
クエリの詳細な実行プランの取得
14
以下のコマンドで詳細な実行プラン(プロファイル情報)が取れる。
BQのクエリエディタからは閲覧できない情報
• ステージが利用したslot数
• ステージの開始時間、終了時間
• 出力したバイト数
などを格納したJSONファイルが得られる。
基本的にこちらを見るべき。
ジョブIDはBigQueryのクエリ履歴などから取得できる。
confidential
Mobility Technologies Co., Ltd.
以下は実際のコードの抜粋なので実行確認はしていない。
BigQuery SDKを用いた計測コード例
15
client = bq.Client(project="my-project")
job_config = bq.job.QueryJobConfig(use_query_cache=False) # cache off
for idx in range(5):
job = client.query(query="select age from students", job_config=job_config)
start = time.time()
_ = job.result() # 終了まで待機
duration = time.time() - start
# profileの取得
res_str = subprocess.check_output([
"bq", "show", "--format=prettyjson", "-j", job.job_id
]).decode("ascii")
inner_duration = job.ended - job.started # ジョブ自体の実行時間取得 (通信時間を含まない)
inner_seconds = inner_duration.seconds + inner_duration.microseconds/(1000*1000)
durations.append(duration)
inner_durations.append(inner_seconds)
confidential
Mobility Technologies Co., Ltd.
実行プランのJSONは人間が見るのがきついので、bq-visualizerという可視化ツールを用いる。
右図のようにステージごとに、
いつ実施されているかも確認できる。
(実例を示す)
詳細な実行プランの可視化
16
https://github.com/GoogleCloudPlatform/professional-services/tree/master/tools/bq-visualizer
開発者がhttps://bqvisualiser.appspot.com/ でインスタンスを立ち上げている
confidential
Mobility Technologies Co., Ltd.
Timelineを見ればどのステージがボトルネックになっているかわかる。
明らかに実行時間が長いステージがあるクエリは高速化しやすい。
ステージの統計情報を見ると、そのステージの何が重いかわかる。
ボトルネックを見つける
17
項目例 意味
readMsAvg, readMsMax Slotが入力データの読み取りに費やした時間の平均と最大
computeMsAvg, computeMsMax SlotがCPUの利用に費やした時間の平均と最大
writeMsAvg, writeMsMax Slotが出力の書き込みに費やした時間の平均と最大
waitMsAvg, waitMsMax (おそらく) slotの割り当て待ちに費やした時間
slotMs スロットの合計処理時間
https://cloud.google.com/bigquery/query-plan-explanation?hl=ja
これでread, compute, writeのどれが悪いか考えるのだが、複雑なクエリはだいたいcomputeが悪い。
Max/Avgが大きいと一部のSlotに処理が偏っていることがわかる。
confidential
Mobility Technologies Co., Ltd.
ステージの種類
18
種別 概要
Input データを読み込む
Join+ テーブルの結合と集計処理を行う (+は集計の意味)
Output データを出力する
Aggregate+ 集計処理を行う (+の意味は不明。フィルター?)
Coalesce 複数のノードに分散したテーブルを1ノードにまとめる。Broadcast joinの前
処理として必要になる。
Repartition おそらく、hash joinの際のhash値とshardの対応関係をやり直して負荷を均
等にするための処理。Hash joinの前処理として必要になる。
confidential
Mobility Technologies Co., Ltd.
ステージの処理内容はStepという形に分解されてクエリプランに埋め込まれている。
これをSQLと比較し、クエリのどの部分が重いかを判別する。
$270などの表記は、BQ内部の変数名。
ステージの詳細を見る
19
READ
$270:ts, $271:user_id, $273:lat, $274:lon,
$275:user_status, $272:park_id
FROM user_tables.positions_v04
WHERE and(between($270, 1580513400.000000000,
1580601600.000000000), greater($275, 0))
COMPUTE
$870 := timestamp_sub(timestamp_trunc($270, 9),
mod(extract($270, 9), 15), 9)
confidential
Mobility Technologies Co., Ltd.
処理のボトルネックを発見するには、
1. Jobの実行プランを取得する
2. 重いステージを見つける
3. 重いステージのどの側面が重いかを確認する
4. ステージがSQLのどこに該当するか確認する
という工程を辿ると良い。
クエリのプロファイリングまとめ
20
confidential
Mobility Technologies Co., Ltd.
実践編
21
confidential
Mobility Technologies Co., Ltd.
そもそも、SQLのような自由度の低い言語で書かれた処理に最適化の余地があるのか?
クエリの処理が遅い理由は2つに大別できる。
1. 無駄な処理をしている
アルゴリズム的に不要な処理や、BQの仕組み的に余計な時間がかかる処理をしている
2. BigQueryのリソースを使い切れていない
これらの具体例を示し、プロファイルと対比させることで、パフォーマンス上の問題が
プロファイラでどう表現されるかを紹介する。
本章の内容はBigQueryの内部実装の推測を含むため、誤りや将来変更される可能性がある。
なお、具体例は実際に遭遇したパフォーマンス低下例だが、登場するテーブル名やカラム名, 処理
内容等は架空のものである。
いつクエリを最適化できるのか?
22
confidential
Mobility Technologies Co., Ltd.
GPSをつけたユーザーが平均的にどの位置にいるかを求めるクエリを考える。
ユーザーの位置はuser_posテーブルに15秒ごとに書き込まれる。
ユーザーが位置トラッキングをOFFにしているときは、300秒ごとにuser_busy_timingテーブルにロ
グが書き込まれる。
Case 1. アルゴリズム的に無駄な処理をしている
23
WITH busy as
(
SELECT
user_id,
t - 150 as start_ts,
t + 150 as end_ts
FROM user_busy_timing
)
SELECT
user_id,
ST_GEOGPOINT(AVG(lon), AVG(lat)) AS point
FROM user_pos as t
WHERE
NOT EXISTS (
SELECT user_id FROM busy AS p
WHERE t.ts BETWEEN p.start_ts AND p.end_ts
AND t.user_id = p.user_id)
GROUP BY user_id
実際はもっと長いSQLクエリの一部だが、プロファイリン
グの結果、右のクエリの周辺がボトルネックであることが
判明。
confidential
Mobility Technologies Co., Ltd.
以下はステージを可視化した例。
200行ぐらいあり、With文によるサブクエリが10以上ある
実際のクエリ
24
confidential
Mobility Technologies Co., Ltd.
重い処理の特定
25
READ
$510, $511, $512, $513, $514, $515
FROM __stage0B_output
READ
$90, $91
FROM __stage09_output
AGGREGATE
GROUP BY $540 := $535, $541 := $531
$390 := SHARD_AVG($533)
$391 := SHARD_AVG($532)
$392 := SUM($534)
JOIN
ANTI HASH JOIN EACH WITH EACH ON $511 = $91
WITH busy as(
SELECT
user_id,
t - 150 as start_ts,
t + 150 as end_ts
FROM user_busy_timing
)
SELECT
user_id,
ST_GEOGPOINT(AVG(lon), AVG(lat)) AS point
FROM user_pos
WHERE
NOT EXISTS (
SELECT user_id FROM busy AS p
WHERE ts BETWEEN p.start_ts AND p.end_ts
AND t.user_id = p.user_id)
GROUP BY user_id
Stageの統計情報や、処理詳細から重い処理を特定する。
1. 重いのはcompute処理 (ST_GEOGPOINTやSHARD_AVGやANTI HASH JOIN)
2. ステージ詳細を見ると、ST_GEOGPOINTはこのstageには含まれていない
3. ボトルネックはSHARD_AVGか、ANTI HASH JOIN。
avg max
read 0 ms 0 ms
compute 168,634 ms 544,593 ms
write 20 ms 759 ms
confidential
Mobility Technologies Co., Ltd.
ステージ詳細には自分で書いた覚えのない処理が出てくる。
ドキュメントがあまりないが、おそらく処理内容は以下の通り。
(捕捉) ステージ詳細に出てくる関数
26
処理名 内容
SHARD_AVG SHARD単位での平均処理
ROOT_AVG SHARD単位の結果をまとめた全体の平均処理
EACH WITH ALL broadcast joinを実行している
EACH WITH EACH Broadcast出ないjoinを実行している
ANTI HASH JOIN NOT EXISTSを使った時に走る処理
confidential
Mobility Technologies Co., Ltd.
NOT EXISTSをコメントアウトすると高速化したのでANTI HASH JOINが遅いことがわかった。
JOINの高速化はJOIN前に件数を減らせないか考える。
高速化
27
WITH busy as
(
SELECT
user_id,
t - 150 as start_ts,
t + 150 as end_ts
FROM user_busy_timing
)
SELECT
user_id,
ST_GEOGPOINT(AVG(lon), AVG(lat)) AS point
FROM user_pos
WHERE
NOT EXISTS (
SELECT user_id FROM busy AS p
WHERE ts BETWEEN p.start_ts AND p.end_ts
AND t.user_id = p.user_id)
GROUP BY user_id
busyサブクエリは300秒ごとに来ているログなので、時間的
に連続性があるためマージできる。
120秒~420秒で
トラッキングOFF
420秒~720秒で
トラッキングOFF
120秒~720秒で
トラッキングOFF
NOT EXISTS前に、トラッキングOFFエントリを
mergeする処理を追加することで
約2倍の高速化を達成
この件数が多い
confidential
Mobility Technologies Co., Ltd.
Self-joinはテーブル内のデータ間の関係を分析するのに使えるが、BigQueryではアンチパターン
とされている。
以下のように、自分自身をJOINするのがself-joinで、意外と使い道がある。
Case 2. BQ的に無駄な処理をしている
28
https://cloud.google.com/bigquery/docs/best-practices-performance-patterns
WITH src AS (
…
)
SELECT
…
FROM src AS left JOIN src AS right
ON …
同じサブクエリが二回くる
confidential
Mobility Technologies Co., Ltd.
Self-joinは直感に反して、同じ処理を2回行うためslot消費が激しくなる。
Self-joinの実行モデル
29
Stage1
src結果
WITH src AS (
…
)
SELECT
…
FROM src AS left JOIN src AS right
ON … Stage2
イメージするself-join
Stage1
src結果
Stage2
実際のself-join
Stage1’
src結果
src処理 src処理 src処理
confidential
Mobility Technologies Co., Ltd.
Self-joinにありがちなTimelineは以下のようになる。
処理内容が同じで処理時間も同じようなStageが並ぶようになる。
プロファイリング
30
ほぼ同じ処理が2個並ぶ
confidential
Mobility Technologies Co., Ltd.
Self-joinの多くは、Analytic Functionで消去できる。
例を出したいが、説明が困難なので省略。
高速化
31
実務ではSelf-Joinをanalytic functionに置き換えることで、
slot利用量が約半分に改善。実行時間は8割になった。
Slot利用量が半分になっても、プロジェクトにslotが余っていた場合、処理時間は半分にはならない。
confidential
Mobility Technologies Co., Ltd.
各施設近辺にいるユーザー数をカウントするクエリを考える。
各施設の中心から1km以内にいるユーザーをその施設にいるものとする。
Case 3. BQのリソースを使いきれていない
32
WITH USER_POINTS AS (
複雑な処理
)
SELECT
area_centers.area_id,
COUNT(user_points.user_id)
FROM
USER_POINTS, area_centers
WHERE
ST_DISTANCE(user_point, area_point) <= 1000
GROUP BY area_id
USER_POINTSとarea_centersのCROSS JOINを行い、
全ユーザーと全施設の組み合わせを計算している。
ユーザーの数を10万, エリアの数を5000とすると
5億回の距離計算が走る処理であり、高負荷であ
ることが予想される。
処理があまりにシンプルで削るのが難しい・・・。
confidential
Mobility Technologies Co., Ltd.
プロファイルには各時刻のslot利用数が記録されている。
これを見ると、理論上は2000slotを使える筈なのに、長時間少ないslot利用数に留まっている。
このことから、このクエリはBQのリソースを有効活用できていないことがわかる。
プロファイリング
33
confidential
Mobility Technologies Co., Ltd.
Slot利用数の時間推移は、タイムライン メタデータから計算して求められている。
元データは、数秒おきの以下の項目が記録されている。
(捕捉) Timelineの元データ
34
https://cloud.google.com/bigquery/query-plan-explanation#timeline_metadata
項目名 内容
elapsedMs クエリ開始からの経過時間
totalSlotMs クエリでのスロットの合計処理時間
activeUnits ワーカーが処理している作業単位の合計数
completedUnits クエリで完了した作業単位の合計数
bq-visualizerではSlot利用数をelapsedMsとtotalSlotMsから算出している。
confidential
Mobility Technologies Co., Ltd.
これはstageのshard分割数が少ないためである。1 shard 1 slot なので、shardが少ないと利用できる
slot 量が少なくなってしまう。
stageのshard数は入力に取るsinkの数に依存する。stageが入力として取るsinkの数は、プロファイ
ラの”parallel Inputs”という項目で確かめることができる。
この例ではparallel inputsが107となっており、slotが107までしか(実際は90程度)同時に使えないよ
うになっていた。
なぜslot利用量が少ないのか
35
処理が重いstageには, 多くのslotが割り当てられ
るべきである。しかし、各stageの出力sink数は
bigqueryが謎のアルゴリズムで決めており干渉
が難しい。(行数などから決めているらしい)
図はGoogle BigQuery The Definitive Guideより引用
confidential
Mobility Technologies Co., Ltd.
Stageあたりの出力sink数をbigqueryのアルゴリズムを騙して増やす。
並列 read トリック
36
WITH USER_POINTS AS (
複雑な処理
), MULTIPLE_READ AS (
SELECT * FROM USER_POINTS WHERE MOD(user_id,3)=0
UNION ALL
SELECT * FROM USER_POINTS WHERE MOD(user_id,3)=1
UNION ALL
SELECT * FROM USER_POINTS WHERE MOD(user_id,3)=2
)
SELECT
area_centers.area_id,
COUNT(user_points.user_id)
FROM
MULTIPLE_READ, area_centers
WHERE
ST_DISTANCE(user_point, area_point) <= 1000
GROUP BY area_id
左のように、出力sink数が少ない処理 (ここで
はUSER_POINTS) を何度も読みだし、UNION
ALL で結合することで、sink数を結合数分増や
すことができる。
左の例では出力sink数が3倍となり、処理の並
列度が向上する。
実際のクエリだと12並列readを行うことで、処
理時間が4分の1になった。
confidential
Mobility Technologies Co., Ltd.
並列 read 後のプロファイル
37
ピーク時の消費スロット数が大幅に上昇していることがわかる。
最適化前
最適化後
confidential
Mobility Technologies Co., Ltd.
適切にプロファイリングを行うことで、パフォーマンスの問題点を見つけることができる。
パフォーマンスの問題点さえわかれば、BQのアーキテクチャ知識や業務知識で高速化できる。
なお、扱わなかった強力な最適化方法として
- Clustering, Partitioningによる読み込み高速化
- ARRAYを用いた高速化
などもある。Google BigQuery The Definitive Guideにはいくつかの例が掲載されているので、読む
とアイディアがもらえる。
BigQueryの高速化はあまり労力がかからないので、一度トライする価値はある。
まとめ
38
confidential
Mobility Technologies Co., Ltd.
人智を超越した理不尽な挙動おまけ
39
confidential
Mobility Technologies Co., Ltd.
SQLに定数を埋めこみたい時、複数の実現手段が考えられる。
どれも一長一短がある。
定数埋め込み技法
40
SELECT技法
With const as (
100 AS MAGIC_NO
)
SCRIPT技法
DECLARE MAGIC_NO INT64
DEFAULT 100;
UDF技法
CREATE TEMP FUNCTION
MAGIC_NO () AS (100)
これらをST_DISTANCE(point, mesh_point) <= MAGIC_NO のように用いた場合、
処理時間に大きく差が出る。
技法 時間
SELECT 132秒
SCRIPT 49秒
UDF 353秒
confidential
Mobility Technologies Co., Ltd.
 上記クエリはMAGIC_NOとしてスクリプト式か、定数を直接埋め込んだ時のみ、専用の最適化が
走るっぽい。以下のようなJOIN方式に切り替わり高速化される。(あくまで推測)
なぜ定数の埋め込み方でパフォーマンスに差が?
41
FROM
AGGREGATED_POINT as ap, MESH as m
WHERE
ST_DISTANCE(point, mesh_point) <= MAGIC_NO
CROSS EACH WITH EACH ON st_dwithin($1581, $1586, 2400)

More Related Content

What's hot

2. BigQuery ML を用いた時系列データの解析 (ARIMA model)
2. BigQuery ML を用いた時系列データの解析 (ARIMA model)2. BigQuery ML を用いた時系列データの解析 (ARIMA model)
2. BigQuery ML を用いた時系列データの解析 (ARIMA model)
幸太朗 岩澤
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
 
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
Amazon Web Services Japan
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
kwatch
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
MLOps入門
MLOps入門MLOps入門
MLOps入門
Hiro Mura
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Noritaka Sekiyama
 
今だから知りたい BigQuery 再入門 | Google Cloud INSIDE Games & Apps: Online
今だから知りたい BigQuery 再入門 | Google Cloud INSIDE Games & Apps: Online今だから知りたい BigQuery 再入門 | Google Cloud INSIDE Games & Apps: Online
今だから知りたい BigQuery 再入門 | Google Cloud INSIDE Games & Apps: Online
Google Cloud Platform - Japan
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
Tetsutaro Watanabe
 
AWSで作る分析基盤
AWSで作る分析基盤AWSで作る分析基盤
AWSで作る分析基盤
Yu Otsubo
 
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)
Tokoroten Nakayama
 
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLiveDXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
Tokoroten Nakayama
 
AWSではじめるMLOps
AWSではじめるMLOpsAWSではじめるMLOps
AWSではじめるMLOps
MariOhbuchi
 
[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう 2019年10月31日 放送
[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう  2019年10月31日 放送[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう  2019年10月31日 放送
[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう 2019年10月31日 放送
Google Cloud Platform - Japan
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
Masahiko Sawada
 
JAZUG12周年 俺の Azure Cosmos DB
JAZUG12周年 俺の Azure Cosmos DBJAZUG12周年 俺の Azure Cosmos DB
JAZUG12周年 俺の Azure Cosmos DB
Daiyu Hatakeyama
 
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
NTT DATA Technology & Innovation
 

What's hot (20)

2. BigQuery ML を用いた時系列データの解析 (ARIMA model)
2. BigQuery ML を用いた時系列データの解析 (ARIMA model)2. BigQuery ML を用いた時系列データの解析 (ARIMA model)
2. BigQuery ML を用いた時系列データの解析 (ARIMA model)
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
MLOps入門
MLOps入門MLOps入門
MLOps入門
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
 
今だから知りたい BigQuery 再入門 | Google Cloud INSIDE Games & Apps: Online
今だから知りたい BigQuery 再入門 | Google Cloud INSIDE Games & Apps: Online今だから知りたい BigQuery 再入門 | Google Cloud INSIDE Games & Apps: Online
今だから知りたい BigQuery 再入門 | Google Cloud INSIDE Games & Apps: Online
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
AWSで作る分析基盤
AWSで作る分析基盤AWSで作る分析基盤
AWSで作る分析基盤
 
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)
 
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLiveDXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
 
AWSではじめるMLOps
AWSではじめるMLOpsAWSではじめるMLOps
AWSではじめるMLOps
 
[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう 2019年10月31日 放送
[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう  2019年10月31日 放送[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう  2019年10月31日 放送
[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう 2019年10月31日 放送
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
 
JAZUG12周年 俺の Azure Cosmos DB
JAZUG12周年 俺の Azure Cosmos DBJAZUG12周年 俺の Azure Cosmos DB
JAZUG12周年 俺の Azure Cosmos DB
 
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
 

Similar to BigQuery Query Optimization クエリ高速化編

Azure Database for MySQL PostgreSQLを使って運用の手間を省きませんか?
Azure Database for MySQL PostgreSQLを使って運用の手間を省きませんか?Azure Database for MySQL PostgreSQLを使って運用の手間を省きませんか?
Azure Database for MySQL PostgreSQLを使って運用の手間を省きませんか?
Suguru Ito
 
弊社BigQuery節約節約事例
弊社BigQuery節約節約事例弊社BigQuery節約節約事例
弊社BigQuery節約節約事例
shoishihara1
 
Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出
Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出
Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出
Google Cloud Platform - Japan
 
Gpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure ai
Gpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure aiGpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure ai
Gpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure ai
Shotaro Suzuki
 
Elastic 7.13-new-features-20210624
Elastic 7.13-new-features-20210624Elastic 7.13-new-features-20210624
Elastic 7.13-new-features-20210624
Shotaro Suzuki
 
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
Shotaro Suzuki
 
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
Google Cloud Platform - Japan
 
Migrating tocloudnativeapplicationwithusingelasticapm
Migrating tocloudnativeapplicationwithusingelasticapmMigrating tocloudnativeapplicationwithusingelasticapm
Migrating tocloudnativeapplicationwithusingelasticapm
Shotaro Suzuki
 
Azure Data Explorer
Azure Data ExplorerAzure Data Explorer
Azure Data Explorer
Daisuke Masubuchi
 
20190514 Smart Store - Azure servlerless architecture
20190514 Smart Store - Azure servlerless architecture20190514 Smart Store - Azure servlerless architecture
20190514 Smart Store - Azure servlerless architecture
Issei Hiraoka
 
Smart Store サーバーレスアーキテクチャ編
Smart Store サーバーレスアーキテクチャ編Smart Store サーバーレスアーキテクチャ編
Smart Store サーバーレスアーキテクチャ編
Microsoft Azure Japan
 
これでBigQueryをドヤ顔で語れる!BigQueryの基本
これでBigQueryをドヤ顔で語れる!BigQueryの基本これでBigQueryをドヤ顔で語れる!BigQueryの基本
これでBigQueryをドヤ顔で語れる!BigQueryの基本
Tomohiro Shinden
 
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#2
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#2しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#2
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#2
オラクルエンジニア通信
 
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターンAzure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
Kazuyuki Miyake
 
DLLAB Ignite Update Data Platform
DLLAB  Ignite Update Data PlatformDLLAB  Ignite Update Data Platform
東北大学AIE - 機械学習中級編とAzure紹介
東北大学AIE - 機械学習中級編とAzure紹介東北大学AIE - 機械学習中級編とAzure紹介
東北大学AIE - 機械学習中級編とAzure紹介
Daiyu Hatakeyama
 
初めてのデータ分析基盤構築をまかされた、その時何を考えておくと良いのか
初めてのデータ分析基盤構築をまかされた、その時何を考えておくと良いのか初めてのデータ分析基盤構築をまかされた、その時何を考えておくと良いのか
初めてのデータ分析基盤構築をまかされた、その時何を考えておくと良いのか
Techon Organization
 
現場ではこう使った~Office 365 と Azure Functions、Azure Data Factory、Azure SQL Database,...
現場ではこう使った~Office 365 と Azure Functions、Azure Data Factory、Azure SQL Database,...現場ではこう使った~Office 365 と Azure Functions、Azure Data Factory、Azure SQL Database,...
現場ではこう使った~Office 365 と Azure Functions、Azure Data Factory、Azure SQL Database,...
Masayuki Ota
 
第15回JSSUG「Azure SQL Database 超入門」
第15回JSSUG「Azure SQL Database 超入門」第15回JSSUG「Azure SQL Database 超入門」
第15回JSSUG「Azure SQL Database 超入門」
裕之 木下
 
BigQuery ML for unstructured data
BigQuery ML for unstructured dataBigQuery ML for unstructured data
BigQuery ML for unstructured data
幸太朗 岩澤
 

Similar to BigQuery Query Optimization クエリ高速化編 (20)

Azure Database for MySQL PostgreSQLを使って運用の手間を省きませんか?
Azure Database for MySQL PostgreSQLを使って運用の手間を省きませんか?Azure Database for MySQL PostgreSQLを使って運用の手間を省きませんか?
Azure Database for MySQL PostgreSQLを使って運用の手間を省きませんか?
 
弊社BigQuery節約節約事例
弊社BigQuery節約節約事例弊社BigQuery節約節約事例
弊社BigQuery節約節約事例
 
Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出
Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出
Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出
 
Gpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure ai
Gpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure aiGpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure ai
Gpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure ai
 
Elastic 7.13-new-features-20210624
Elastic 7.13-new-features-20210624Elastic 7.13-new-features-20210624
Elastic 7.13-new-features-20210624
 
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
 
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
 
Migrating tocloudnativeapplicationwithusingelasticapm
Migrating tocloudnativeapplicationwithusingelasticapmMigrating tocloudnativeapplicationwithusingelasticapm
Migrating tocloudnativeapplicationwithusingelasticapm
 
Azure Data Explorer
Azure Data ExplorerAzure Data Explorer
Azure Data Explorer
 
20190514 Smart Store - Azure servlerless architecture
20190514 Smart Store - Azure servlerless architecture20190514 Smart Store - Azure servlerless architecture
20190514 Smart Store - Azure servlerless architecture
 
Smart Store サーバーレスアーキテクチャ編
Smart Store サーバーレスアーキテクチャ編Smart Store サーバーレスアーキテクチャ編
Smart Store サーバーレスアーキテクチャ編
 
これでBigQueryをドヤ顔で語れる!BigQueryの基本
これでBigQueryをドヤ顔で語れる!BigQueryの基本これでBigQueryをドヤ顔で語れる!BigQueryの基本
これでBigQueryをドヤ顔で語れる!BigQueryの基本
 
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#2
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#2しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#2
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#2
 
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターンAzure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
 
DLLAB Ignite Update Data Platform
DLLAB  Ignite Update Data PlatformDLLAB  Ignite Update Data Platform
DLLAB Ignite Update Data Platform
 
東北大学AIE - 機械学習中級編とAzure紹介
東北大学AIE - 機械学習中級編とAzure紹介東北大学AIE - 機械学習中級編とAzure紹介
東北大学AIE - 機械学習中級編とAzure紹介
 
初めてのデータ分析基盤構築をまかされた、その時何を考えておくと良いのか
初めてのデータ分析基盤構築をまかされた、その時何を考えておくと良いのか初めてのデータ分析基盤構築をまかされた、その時何を考えておくと良いのか
初めてのデータ分析基盤構築をまかされた、その時何を考えておくと良いのか
 
現場ではこう使った~Office 365 と Azure Functions、Azure Data Factory、Azure SQL Database,...
現場ではこう使った~Office 365 と Azure Functions、Azure Data Factory、Azure SQL Database,...現場ではこう使った~Office 365 と Azure Functions、Azure Data Factory、Azure SQL Database,...
現場ではこう使った~Office 365 と Azure Functions、Azure Data Factory、Azure SQL Database,...
 
第15回JSSUG「Azure SQL Database 超入門」
第15回JSSUG「Azure SQL Database 超入門」第15回JSSUG「Azure SQL Database 超入門」
第15回JSSUG「Azure SQL Database 超入門」
 
BigQuery ML for unstructured data
BigQuery ML for unstructured dataBigQuery ML for unstructured data
BigQuery ML for unstructured data
 

BigQuery Query Optimization クエリ高速化編

  • 1. confidential Mobility Technologies Co., Ltd. BigQuery Query Optimization (公開版) AIシステム部 データサイエンスグループ 老木 智章 2020/05/19
  • 2. confidential Mobility Technologies Co., Ltd. BigQueryを触ったエンジニアの誰もが考える。 「もうちょっとこれ速くならないかな・・・」 が、そのよくわからん挙動に「まあ待てばいいか」と多くの人が涙を飲んできた。 (実際は速いのであまり速さで困ることはない) だが、単純に書かれたBigQueryには十分に高速化の余地がある。 本スライドは読者にBigQueryの速度最適化に取り組む手がかりを提供する。 ゴール: - BigQueryのアーキテクチャがわかるようになる - クエリのプロファイリングができるようになる - クエリの高速化の具体例を知る (数倍レベルで速くなりうる) 概要
  • 3. confidential Mobility Technologies Co., Ltd.  本資料は2019/11に出版された「Google BigQuery: The Definitive Guide」を主な情報源にして いる  BigQueryはインターネットをさらっても、まとまった情報を得るのが難しい  日本語でいい本はパッと見つけられなかった 参考資料 3 表紙画像引用元 https://www.oreilly.com/library/view/google-bigquery-the/9781492044451/
  • 4. confidential Mobility Technologies Co., Ltd. BQのアーキテクチャ 4 01
  • 5. confidential Mobility Technologies Co., Ltd. BigQueryはSQLをインターフェイスとした、分散コンピューティング基盤である。 SQLで記述したジョブをいい感じに分割し、多数のノードに処理を分散してくれる。 生徒の成績が入ったテーブルで成績を合計する場合は、2個のコンテナが立ち上がり、それぞれ成績 の一部を合計する。その後に、2つの結果を足し合わせると全体の合計が得られる。 このような、自動的な処理の分散を行ってくれるのがBQの優れた点である。 BigQueryの大雑把な概念 5 生 徒 名 成 績 生 徒 名 成 績 container1 container2 テーブルの列ごとに複数のファイ ルに分割して保存されている SELECT SUM(score) FROM students
  • 6. confidential Mobility Technologies Co., Ltd. BigQueryではSQLはStageという処理単位に分割されて実行される。 各stageは並列して実行可能。 以下の例ではCOUNT演算を二つのstageに分割して実行している。 SQLの実行モデル 6 SELECT COUNT(*) as c FROM `bigquery-public- data.new_york_taxi_trips.tlc_yellow_trips_2017` WHERE passenger_count > 5 各stageはさらにShardという実行可能タスクに分割され実行される。 S00ステージは、9つのshardに分割されている。 各shardでは、9分の1のデータずつCOUNT処理を行う。 S01ステージでは、上記shardの9個の出力を合計している。
  • 7. confidential Mobility Technologies Co., Ltd. ShardはBorgと呼ばれるコンテナ実行エンジンで実行される。 shardは実行時にSchedulerからSlotを割り当てられて実行される。 1 slotはCPUのコアの半分と、1GBのRAMで構成される。 1つのshardは1つのslotで実行される。 Shardの実行モデル 7 各shardは、 • 前のstageの一部が完了して • Slotに空きができる と実行され、実行結果をShuffleFS (基本的に インメモリ)に書き込む。 図はGoogle BigQuery The Definitive Guideより引用
  • 8. confidential Mobility Technologies Co., Ltd.  使えるSlot数の上限はプロジェクトの契約形態による  オンデマンド契約であればプロジェクトあたり同時実行スロット数 2000 (上限突破しうる)  下のオレンジの線がリミットだが上限突破している  定額プランなら契約次第  MonitoringツールからプロジェクトのSlot利用量を確認することができる。  下図はMonitoringツール Slotの上限 8
  • 9. confidential Mobility Technologies Co., Ltd. ShardとSink 9 Shardの処理結果はShuffleFSにSinkと呼ばれる単位で書き込まれている。 「クラスごとに男子の平均点を計算する」クエリを考える。 Stage1で男子だけ抽出するフィルター処理、Stage2でクラスごとに集計する処理が行われる。 Stage1は、1番目のSinkにクラスAの男子のスコアを、2番目のSinkにクラスBの男子のスコアを という風に、次のStageで必要となる単位に応じて出力先を振り分ける。 SELECT class_id, AVG(score) FROM all_scores WHERE sex = ‘male’ GROUP BY class_id 実際には、一つのSinkに複数クラスのスコアを入れる ため、Sinkの数とクラス数は一対一対応ではない。 Sink数は、BQが謎のアルゴリズムで決定する。 図はGoogle BigQuery The Definitive Guideより引用
  • 10. confidential Mobility Technologies Co., Ltd.  BigQueryはSQLをStageに分割し、さらにStageはShardに分割される  Shardはコンテナエンジンで並列実行される  ShardはSinkと呼ばれる単位で結果を出力する まとめ 10
  • 11. confidential Mobility Technologies Co., Ltd. クエリのプロファイリング 11 02
  • 12. confidential Mobility Technologies Co., Ltd. 最適化では、実行時間の測定とプロファイリングを行う。  実行時間の測定  短くしたい対象の処理時間を計測する (今回はクエリの実行時間)  測定結果にはばらつきがあるので、必ず複数回計測し平均か中央値をとる  2割ぐらいは平気でばらつく  クエリ文が同一だとキャッシュが聞くため、キャッシュをoffにすること  プロジェクト内でslot消費が激しいクエリが他に走っていると、かなり遅くなる  プロファイリング  クエリのうち処理が重いのは一部分であることが多いので、そこを特定する作業  処理が重い部分がわかれば8割勝ってる 実行時間の測定とプロファイリング 12
  • 13. confidential Mobility Technologies Co., Ltd. BQの最適化において直感で効率が悪い箇所を発見するのは不可能。 クエリがどうstageに分割されるかや、どのstageが重いかは人類の直感を超える。 そこで、プロファイル情報を取得することで、クエリのボトルネックを同定する。 BQのクエリエディタにもプロファイル情報が乗っているが情報が少なく見づらい。 クエリのプロファイリング 13 BQクエリエディタ付属の プロファイル情報 →
  • 14. confidential Mobility Technologies Co., Ltd. bq show --format=prettyjson -j (ジョブID) クエリの詳細な実行プランの取得 14 以下のコマンドで詳細な実行プラン(プロファイル情報)が取れる。 BQのクエリエディタからは閲覧できない情報 • ステージが利用したslot数 • ステージの開始時間、終了時間 • 出力したバイト数 などを格納したJSONファイルが得られる。 基本的にこちらを見るべき。 ジョブIDはBigQueryのクエリ履歴などから取得できる。
  • 15. confidential Mobility Technologies Co., Ltd. 以下は実際のコードの抜粋なので実行確認はしていない。 BigQuery SDKを用いた計測コード例 15 client = bq.Client(project="my-project") job_config = bq.job.QueryJobConfig(use_query_cache=False) # cache off for idx in range(5): job = client.query(query="select age from students", job_config=job_config) start = time.time() _ = job.result() # 終了まで待機 duration = time.time() - start # profileの取得 res_str = subprocess.check_output([ "bq", "show", "--format=prettyjson", "-j", job.job_id ]).decode("ascii") inner_duration = job.ended - job.started # ジョブ自体の実行時間取得 (通信時間を含まない) inner_seconds = inner_duration.seconds + inner_duration.microseconds/(1000*1000) durations.append(duration) inner_durations.append(inner_seconds)
  • 16. confidential Mobility Technologies Co., Ltd. 実行プランのJSONは人間が見るのがきついので、bq-visualizerという可視化ツールを用いる。 右図のようにステージごとに、 いつ実施されているかも確認できる。 (実例を示す) 詳細な実行プランの可視化 16 https://github.com/GoogleCloudPlatform/professional-services/tree/master/tools/bq-visualizer 開発者がhttps://bqvisualiser.appspot.com/ でインスタンスを立ち上げている
  • 17. confidential Mobility Technologies Co., Ltd. Timelineを見ればどのステージがボトルネックになっているかわかる。 明らかに実行時間が長いステージがあるクエリは高速化しやすい。 ステージの統計情報を見ると、そのステージの何が重いかわかる。 ボトルネックを見つける 17 項目例 意味 readMsAvg, readMsMax Slotが入力データの読み取りに費やした時間の平均と最大 computeMsAvg, computeMsMax SlotがCPUの利用に費やした時間の平均と最大 writeMsAvg, writeMsMax Slotが出力の書き込みに費やした時間の平均と最大 waitMsAvg, waitMsMax (おそらく) slotの割り当て待ちに費やした時間 slotMs スロットの合計処理時間 https://cloud.google.com/bigquery/query-plan-explanation?hl=ja これでread, compute, writeのどれが悪いか考えるのだが、複雑なクエリはだいたいcomputeが悪い。 Max/Avgが大きいと一部のSlotに処理が偏っていることがわかる。
  • 18. confidential Mobility Technologies Co., Ltd. ステージの種類 18 種別 概要 Input データを読み込む Join+ テーブルの結合と集計処理を行う (+は集計の意味) Output データを出力する Aggregate+ 集計処理を行う (+の意味は不明。フィルター?) Coalesce 複数のノードに分散したテーブルを1ノードにまとめる。Broadcast joinの前 処理として必要になる。 Repartition おそらく、hash joinの際のhash値とshardの対応関係をやり直して負荷を均 等にするための処理。Hash joinの前処理として必要になる。
  • 19. confidential Mobility Technologies Co., Ltd. ステージの処理内容はStepという形に分解されてクエリプランに埋め込まれている。 これをSQLと比較し、クエリのどの部分が重いかを判別する。 $270などの表記は、BQ内部の変数名。 ステージの詳細を見る 19 READ $270:ts, $271:user_id, $273:lat, $274:lon, $275:user_status, $272:park_id FROM user_tables.positions_v04 WHERE and(between($270, 1580513400.000000000, 1580601600.000000000), greater($275, 0)) COMPUTE $870 := timestamp_sub(timestamp_trunc($270, 9), mod(extract($270, 9), 15), 9)
  • 20. confidential Mobility Technologies Co., Ltd. 処理のボトルネックを発見するには、 1. Jobの実行プランを取得する 2. 重いステージを見つける 3. 重いステージのどの側面が重いかを確認する 4. ステージがSQLのどこに該当するか確認する という工程を辿ると良い。 クエリのプロファイリングまとめ 20
  • 22. confidential Mobility Technologies Co., Ltd. そもそも、SQLのような自由度の低い言語で書かれた処理に最適化の余地があるのか? クエリの処理が遅い理由は2つに大別できる。 1. 無駄な処理をしている アルゴリズム的に不要な処理や、BQの仕組み的に余計な時間がかかる処理をしている 2. BigQueryのリソースを使い切れていない これらの具体例を示し、プロファイルと対比させることで、パフォーマンス上の問題が プロファイラでどう表現されるかを紹介する。 本章の内容はBigQueryの内部実装の推測を含むため、誤りや将来変更される可能性がある。 なお、具体例は実際に遭遇したパフォーマンス低下例だが、登場するテーブル名やカラム名, 処理 内容等は架空のものである。 いつクエリを最適化できるのか? 22
  • 23. confidential Mobility Technologies Co., Ltd. GPSをつけたユーザーが平均的にどの位置にいるかを求めるクエリを考える。 ユーザーの位置はuser_posテーブルに15秒ごとに書き込まれる。 ユーザーが位置トラッキングをOFFにしているときは、300秒ごとにuser_busy_timingテーブルにロ グが書き込まれる。 Case 1. アルゴリズム的に無駄な処理をしている 23 WITH busy as ( SELECT user_id, t - 150 as start_ts, t + 150 as end_ts FROM user_busy_timing ) SELECT user_id, ST_GEOGPOINT(AVG(lon), AVG(lat)) AS point FROM user_pos as t WHERE NOT EXISTS ( SELECT user_id FROM busy AS p WHERE t.ts BETWEEN p.start_ts AND p.end_ts AND t.user_id = p.user_id) GROUP BY user_id 実際はもっと長いSQLクエリの一部だが、プロファイリン グの結果、右のクエリの周辺がボトルネックであることが 判明。
  • 24. confidential Mobility Technologies Co., Ltd. 以下はステージを可視化した例。 200行ぐらいあり、With文によるサブクエリが10以上ある 実際のクエリ 24
  • 25. confidential Mobility Technologies Co., Ltd. 重い処理の特定 25 READ $510, $511, $512, $513, $514, $515 FROM __stage0B_output READ $90, $91 FROM __stage09_output AGGREGATE GROUP BY $540 := $535, $541 := $531 $390 := SHARD_AVG($533) $391 := SHARD_AVG($532) $392 := SUM($534) JOIN ANTI HASH JOIN EACH WITH EACH ON $511 = $91 WITH busy as( SELECT user_id, t - 150 as start_ts, t + 150 as end_ts FROM user_busy_timing ) SELECT user_id, ST_GEOGPOINT(AVG(lon), AVG(lat)) AS point FROM user_pos WHERE NOT EXISTS ( SELECT user_id FROM busy AS p WHERE ts BETWEEN p.start_ts AND p.end_ts AND t.user_id = p.user_id) GROUP BY user_id Stageの統計情報や、処理詳細から重い処理を特定する。 1. 重いのはcompute処理 (ST_GEOGPOINTやSHARD_AVGやANTI HASH JOIN) 2. ステージ詳細を見ると、ST_GEOGPOINTはこのstageには含まれていない 3. ボトルネックはSHARD_AVGか、ANTI HASH JOIN。 avg max read 0 ms 0 ms compute 168,634 ms 544,593 ms write 20 ms 759 ms
  • 26. confidential Mobility Technologies Co., Ltd. ステージ詳細には自分で書いた覚えのない処理が出てくる。 ドキュメントがあまりないが、おそらく処理内容は以下の通り。 (捕捉) ステージ詳細に出てくる関数 26 処理名 内容 SHARD_AVG SHARD単位での平均処理 ROOT_AVG SHARD単位の結果をまとめた全体の平均処理 EACH WITH ALL broadcast joinを実行している EACH WITH EACH Broadcast出ないjoinを実行している ANTI HASH JOIN NOT EXISTSを使った時に走る処理
  • 27. confidential Mobility Technologies Co., Ltd. NOT EXISTSをコメントアウトすると高速化したのでANTI HASH JOINが遅いことがわかった。 JOINの高速化はJOIN前に件数を減らせないか考える。 高速化 27 WITH busy as ( SELECT user_id, t - 150 as start_ts, t + 150 as end_ts FROM user_busy_timing ) SELECT user_id, ST_GEOGPOINT(AVG(lon), AVG(lat)) AS point FROM user_pos WHERE NOT EXISTS ( SELECT user_id FROM busy AS p WHERE ts BETWEEN p.start_ts AND p.end_ts AND t.user_id = p.user_id) GROUP BY user_id busyサブクエリは300秒ごとに来ているログなので、時間的 に連続性があるためマージできる。 120秒~420秒で トラッキングOFF 420秒~720秒で トラッキングOFF 120秒~720秒で トラッキングOFF NOT EXISTS前に、トラッキングOFFエントリを mergeする処理を追加することで 約2倍の高速化を達成 この件数が多い
  • 28. confidential Mobility Technologies Co., Ltd. Self-joinはテーブル内のデータ間の関係を分析するのに使えるが、BigQueryではアンチパターン とされている。 以下のように、自分自身をJOINするのがself-joinで、意外と使い道がある。 Case 2. BQ的に無駄な処理をしている 28 https://cloud.google.com/bigquery/docs/best-practices-performance-patterns WITH src AS ( … ) SELECT … FROM src AS left JOIN src AS right ON … 同じサブクエリが二回くる
  • 29. confidential Mobility Technologies Co., Ltd. Self-joinは直感に反して、同じ処理を2回行うためslot消費が激しくなる。 Self-joinの実行モデル 29 Stage1 src結果 WITH src AS ( … ) SELECT … FROM src AS left JOIN src AS right ON … Stage2 イメージするself-join Stage1 src結果 Stage2 実際のself-join Stage1’ src結果 src処理 src処理 src処理
  • 30. confidential Mobility Technologies Co., Ltd. Self-joinにありがちなTimelineは以下のようになる。 処理内容が同じで処理時間も同じようなStageが並ぶようになる。 プロファイリング 30 ほぼ同じ処理が2個並ぶ
  • 31. confidential Mobility Technologies Co., Ltd. Self-joinの多くは、Analytic Functionで消去できる。 例を出したいが、説明が困難なので省略。 高速化 31 実務ではSelf-Joinをanalytic functionに置き換えることで、 slot利用量が約半分に改善。実行時間は8割になった。 Slot利用量が半分になっても、プロジェクトにslotが余っていた場合、処理時間は半分にはならない。
  • 32. confidential Mobility Technologies Co., Ltd. 各施設近辺にいるユーザー数をカウントするクエリを考える。 各施設の中心から1km以内にいるユーザーをその施設にいるものとする。 Case 3. BQのリソースを使いきれていない 32 WITH USER_POINTS AS ( 複雑な処理 ) SELECT area_centers.area_id, COUNT(user_points.user_id) FROM USER_POINTS, area_centers WHERE ST_DISTANCE(user_point, area_point) <= 1000 GROUP BY area_id USER_POINTSとarea_centersのCROSS JOINを行い、 全ユーザーと全施設の組み合わせを計算している。 ユーザーの数を10万, エリアの数を5000とすると 5億回の距離計算が走る処理であり、高負荷であ ることが予想される。 処理があまりにシンプルで削るのが難しい・・・。
  • 33. confidential Mobility Technologies Co., Ltd. プロファイルには各時刻のslot利用数が記録されている。 これを見ると、理論上は2000slotを使える筈なのに、長時間少ないslot利用数に留まっている。 このことから、このクエリはBQのリソースを有効活用できていないことがわかる。 プロファイリング 33
  • 34. confidential Mobility Technologies Co., Ltd. Slot利用数の時間推移は、タイムライン メタデータから計算して求められている。 元データは、数秒おきの以下の項目が記録されている。 (捕捉) Timelineの元データ 34 https://cloud.google.com/bigquery/query-plan-explanation#timeline_metadata 項目名 内容 elapsedMs クエリ開始からの経過時間 totalSlotMs クエリでのスロットの合計処理時間 activeUnits ワーカーが処理している作業単位の合計数 completedUnits クエリで完了した作業単位の合計数 bq-visualizerではSlot利用数をelapsedMsとtotalSlotMsから算出している。
  • 35. confidential Mobility Technologies Co., Ltd. これはstageのshard分割数が少ないためである。1 shard 1 slot なので、shardが少ないと利用できる slot 量が少なくなってしまう。 stageのshard数は入力に取るsinkの数に依存する。stageが入力として取るsinkの数は、プロファイ ラの”parallel Inputs”という項目で確かめることができる。 この例ではparallel inputsが107となっており、slotが107までしか(実際は90程度)同時に使えないよ うになっていた。 なぜslot利用量が少ないのか 35 処理が重いstageには, 多くのslotが割り当てられ るべきである。しかし、各stageの出力sink数は bigqueryが謎のアルゴリズムで決めており干渉 が難しい。(行数などから決めているらしい) 図はGoogle BigQuery The Definitive Guideより引用
  • 36. confidential Mobility Technologies Co., Ltd. Stageあたりの出力sink数をbigqueryのアルゴリズムを騙して増やす。 並列 read トリック 36 WITH USER_POINTS AS ( 複雑な処理 ), MULTIPLE_READ AS ( SELECT * FROM USER_POINTS WHERE MOD(user_id,3)=0 UNION ALL SELECT * FROM USER_POINTS WHERE MOD(user_id,3)=1 UNION ALL SELECT * FROM USER_POINTS WHERE MOD(user_id,3)=2 ) SELECT area_centers.area_id, COUNT(user_points.user_id) FROM MULTIPLE_READ, area_centers WHERE ST_DISTANCE(user_point, area_point) <= 1000 GROUP BY area_id 左のように、出力sink数が少ない処理 (ここで はUSER_POINTS) を何度も読みだし、UNION ALL で結合することで、sink数を結合数分増や すことができる。 左の例では出力sink数が3倍となり、処理の並 列度が向上する。 実際のクエリだと12並列readを行うことで、処 理時間が4分の1になった。
  • 37. confidential Mobility Technologies Co., Ltd. 並列 read 後のプロファイル 37 ピーク時の消費スロット数が大幅に上昇していることがわかる。 最適化前 最適化後
  • 38. confidential Mobility Technologies Co., Ltd. 適切にプロファイリングを行うことで、パフォーマンスの問題点を見つけることができる。 パフォーマンスの問題点さえわかれば、BQのアーキテクチャ知識や業務知識で高速化できる。 なお、扱わなかった強力な最適化方法として - Clustering, Partitioningによる読み込み高速化 - ARRAYを用いた高速化 などもある。Google BigQuery The Definitive Guideにはいくつかの例が掲載されているので、読む とアイディアがもらえる。 BigQueryの高速化はあまり労力がかからないので、一度トライする価値はある。 まとめ 38
  • 39. confidential Mobility Technologies Co., Ltd. 人智を超越した理不尽な挙動おまけ 39
  • 40. confidential Mobility Technologies Co., Ltd. SQLに定数を埋めこみたい時、複数の実現手段が考えられる。 どれも一長一短がある。 定数埋め込み技法 40 SELECT技法 With const as ( 100 AS MAGIC_NO ) SCRIPT技法 DECLARE MAGIC_NO INT64 DEFAULT 100; UDF技法 CREATE TEMP FUNCTION MAGIC_NO () AS (100) これらをST_DISTANCE(point, mesh_point) <= MAGIC_NO のように用いた場合、 処理時間に大きく差が出る。 技法 時間 SELECT 132秒 SCRIPT 49秒 UDF 353秒
  • 41. confidential Mobility Technologies Co., Ltd.  上記クエリはMAGIC_NOとしてスクリプト式か、定数を直接埋め込んだ時のみ、専用の最適化が 走るっぽい。以下のようなJOIN方式に切り替わり高速化される。(あくまで推測) なぜ定数の埋め込み方でパフォーマンスに差が? 41 FROM AGGREGATED_POINT as ap, MESH as m WHERE ST_DISTANCE(point, mesh_point) <= MAGIC_NO CROSS EACH WITH EACH ON st_dwithin($1581, $1586, 2400)