JOBS_BY_* でジョブ警察
2020-02-14 に INFORMATION_SCHEMA.JOBS_BY_*
ビューがベータになり、誰でも使えるようになりました(BigQuery release notes)。
Cloud Logging で見ていた BigQuery ジョブが BigQuery 単体で追えるようになるアップデートです。何ができるようになったのか見ていきましょう。 最新情報は、公式ドキュメント Getting jobs metadata using INFORMATION_SCHEMA をご確認ください。
INFORMATION_SCHEMA.JOBS_BY_*
ビューで BigQuery ジョブの履歴を見る#
INFORMATION_SCHEMA.JOBS_BY_*
ビューを使うと、実行中の BigQuery ジョブと過去 180 日間1の完了したジョブのメタデータを取得できます。
1: 180 日間とのことですが、私の手元で確認できたログは 2020-01-03 が最新でした。ログの保存開始日が 180 日前より最近である可能性があります。
スキーマは後ほど紹介します。まずはできることの例を見ていきましょう。
#
用途例 5 つ#
高価なクエリを摘発する今年のプロジェクト一課金されたクエリを発見します。
権限がない方が試したい場合には、JOBS_BY_PROJECT
を JOBS_BY_USER
に書き換えて、個人史上一課金されたクエリを見つけてみましょう。
JOBS_BY_ORGANIZATION
には、query
列がないかもしれません。
job_id | user_email | query | total_bytes_processed |
---|---|---|---|
bquxjob_549481d2_170433e2ef2 | abc@xyz.com | SELECT ... FROM ... | 296581077362 |
bquxjob_1889199f_17037f62246 | def@xyz.com | SELECT ... FROM ... | 296272073862 |
bquxjob_276128e9_17037f57be5 | ghi@xyz.com | SELECT ... FROM ... | 296272062336 |
bquxjob_23f9c0e7_17037f2407b | jkl@xyz.com | SELECT ... FROM ... | 296272062336 |
bquxjob_254cda14_17037f422e5 | mno@xyz.com | SELECT ... FROM ... | 296272062336 |
#
プロジェクト利用者を特定する特定のプロジェクトにジョブを送信したすべてのユーザーまたはサービスアカウントを一覧表示します。プロジェクトの棚卸し時に使えそうです。
user_email |
---|
abc@xyz.com |
def@xyz.com |
#
低速な野良クエリを摘発する予め保存されたクエリリストに属さない、スロットを大量消費するクエリを見つけます。スケジュールされたクエリを最適化する際に使えそうです。
user_email | query | total_slot_ms | |
---|---|---|---|
abc@xyz.com | SELECT ... FROM ... | 5274048808 | |
def@xyz.com | SELECT ... FROM ... | 3384028972 | |
ghi@xyz.com | SELECT ... FROM ... | 3143715099 | |
jkl@xyz.com | SELECT ... FROM ... | 3095278727 | |
mno@xyz.com | SELECT ... FROM ... | 2370765019 |
#
使われていないデータセットを摘発する使われていないデータセットを発見し、棚卸しを行います。
ただし、JOBS_BY_ORGANIZATION
は組織内のクエリのログですので、外部公開されたデータセットの場合には、使われていないかの判別に使うことはできません。
catalog_name | schema_name | ||
---|---|---|---|
project-a | dataset_1 | ||
project-a | dataset_2 |
#
平均使用スロットの多い日を特定する特定のプロジェクトの平均使用スロットを表示します。BigQuery Reservations を使ったり、スケジュールされたクエリを使う場合には、スロット使用率の監視が重要になってきます。
end_date | avg_slots |
---|---|
2020-02-16 | 811.4027300231481 |
2020-02-14 | 30.734837708333334 |
2020-02-13 | 71.37354623842593 |
#
INFORMATIONSCHEMA.JOBS_BY* ビュー 3 種ここからはドキュメントベースの解説になります。
#
INFORMATION_SCHEMA.JOBS_BY_USER- 現在のプロジェクトで実行ユーザーから送信されたジョブのみを返す
- bigquery.jobs.list の権限が必要
#
INFORMATION_SCHEMA.JOBS_BY_PROJECT- 現在のプロジェクトで送信されたすべてのジョブを返す
- bigquery.jobs.listAll 権限が必要
#
INFORMATION_SCHEMA.JOBS_BY_ORGANIZATION- 現在のプロジェクトの組織で送信されたすべてのジョブを返す
- 組織の bigquery.jobs.listAll の権限が必要
#
BigQuery ジョブのメタデータスキーマ公式ドキュメントから引用し、日本語を併記、特に重要そうなものを太字にします。
列名 | データタイプ | 値 |
---|---|---|
creation_time | TIMESTAMP | ジョブの作成時間 |
project_id | STRING | プロジェクト ID |
project_number | INTEGER | プロジェクト番号 |
user_email | STRING | ジョブ実行者のメールアドレス |
job_id | STRING | ジョブ ID |
job_type | STRING | ジョブタイプ(QUERY、LOAD、 EXTRACT、COPY、UNKNOWN) |
statement_type | STRING | クエリステートメントタイプ(SELECT、INSERT、UPDATE、DELETE) |
start_time | TIMESTAMP | ジョブの開始時間 |
end_time | TIMESTAMP | ジョブの終了時間 |
query | STRING | SQLクエリ文字列 |
state | STRING | 実行状態(PENDING、 RUNNING、DONE) |
reservation_id | STRING | 割り当てられた reservation 名 |
total_bytes_processed | INTEGER | 処理されたバイト数 |
total_slot_ms | INTEGER | スロットミリ秒 |
error_result | RECORD | エラー |
cache_hit | BOOLEAN | クエリ結果がキャッシュを返したか |
destination_table | RECORD | 宛先テーブル |
referenced_tables | RECORD | 参照されたテーブル |
labels | RECORD | ラベルの配列 |
timeline | RECORD | タイムライン※クエリ実行進捗状況 |
job_stages | RECORD | クエリステージ※BigQuery Web UI の実行の詳細から見れるもの |
#
Cloud Logging と比較して#
優れるところ- ログの保存期間が 180 日と長い
- ログシンク不要で直ぐにクエリが叩ける
- statement_type、referenced_tables など BigQuery の痒いところに手が届く
#
劣るところBigQuery 以外の Google Cloud Platform のジョブを見ることはできないです。用途の違いなので使い分けが大事なようです。
#
まとめINFORMATIONSCHEMA.JOBS_BY* を触って、思いつくユースケース 5 つを書き起こしてみました。 ログベースで色々な分析ができて、まだまだ色々な活用方法があるはずです。 ぜひ活用していきましょう。