41
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

INFORMATION_SCHEMA.JOBS_BY_* で BigQuery ジョブ警察🚨

Last updated at Posted at 2020-02-16

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の完了したジョブのメタデータを取得できます。

スキーマは後ほど紹介します。まずはできることの例を見ていきましょう。

用途例 5 つ

高価なクエリを摘発する

今年のプロジェクト一課金されたクエリを発見します。
権限がない方が試したい場合には、JOBS_BY_PROJECTJOBS_BY_USER に書き換えて、個人史上一課金されたクエリを見つけてみましょう。
JOBS_BY_ORGANIZATION には、query 列がないかもしれません。

SELECT
 job_id,
 user_email,
 query,
 total_bytes_processed
FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE EXTRACT(YEAR FROM creation_time) = 2020
ORDER BY total_bytes_processed DESC
LIMIT 5
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

プロジェクト利用者を特定する

特定のプロジェクトにジョブを送信したすべてのユーザーまたはサービスアカウントを一覧表示します。プロジェクトの棚卸し時に使えそうです。

SELECT
 DISTINCT user_email
FROM
 `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
user_email
abc@xyz.com
def@xyz.com

低速な野良クエリを摘発する

予め保存されたクエリリストに属さない、スロットを大量消費するクエリを見つけます。スケジュールされたクエリを最適化する際に使えそうです。

SELECT
  user_email,
  query,
  total_slot_ms
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
  query IN(
    SELECT
      query
    FROM
      <your_dataset>.query_list
  )
ORDER BY total_slot_ms DESC
LIMIT 5

| 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 は組織内のクエリのログですので、外部公開されたデータセットの場合には、使われていないかの判別に使うことはできません。

WITH
  referenced_dataset AS(
  SELECT
    DISTINCT referenced_table.project_id,
    referenced_table.dataset_id
  FROM
    `<your-project>.region-us.INFORMATION_SCHEMA.JOBS_BY_ORGANIZATION`
  JOIN
    UNNEST(referenced_tables)referenced_table)
SELECT
  catalog_name,
  schema_name
FROM
  `<your-project>.INFORMATION_SCHEMA.SCHEMATA`
LEFT JOIN
  referenced_dataset
ON
  catalog_name=project_id
  AND schema_name=dataset_id
WHERE
  project_id IS NULL

| catalog_name | schema_name |
|:--|:--|:--|:--|
| project-a | dataset_1 |
| project-a | dataset_2 |

平均使用スロットの多い日を特定する

特定のプロジェクトの平均使用スロットを表示します。BigQuery Reservations を使ったり、スケジュールされたクエリを使う場合には、スロット使用率の監視が重要になってきます。

SELECT
  DATE(end_time) AS end_date,
  SUM(total_slot_ms) / (1000*60*60*24) AS avg_slots
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
GROUP BY
  end_date
ORDER BY
  end_date DESC
LIMIT
  3
end_date avg_slots
2020-02-16 811.4027300231481
2020-02-14 30.734837708333334
2020-02-13 71.37354623842593

INFORMATION_SCHEMA.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 のジョブを見ることはできないです。用途の違いなので使い分けが大事なようです。

まとめ

INFORMATION_SCHEMA.JOBS_BY_* を触って、思いつくユースケース 5 つを書き起こしてみました。
ログベースで色々な分析ができて、まだまだ色々な活用方法があるはずです。
ぜひ活用していきましょう。

  1. 180 日間とのことですが、私の手元で確認できたログは 2020-01-03 が最新でした。ログの保存開始日が 180 日前より最近である可能性があります。

41
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?