JOBS_TIMELINE ビュー
INFORMATION_SCHEMA.JOBS_TIMELINE
ビューには、現在のプロジェクトで送信されたすべてのジョブのタイムスライスごとのニア リアルタイムの BigQuery メタデータが含まれます。このビューには、現在実行中のジョブと完了したジョブが表示されます。
必要な権限
INFORMATION_SCHEMA.JOBS_TIMELINE
ビューをクエリするには、プロジェクトの bigquery.jobs.listAll
Identity and Access Management(IAM)権限が必要です。次に示す各 IAM の事前定義ロールには、必要な権限が含まれています。
- プロジェクト オーナー
- BigQuery 管理者
BigQuery の権限の詳細については、IAM でのアクセス制御をご覧ください。
スキーマ
INFORMATION_SCHEMA.JOBS_TIMELINE_BY_*
ビューに対してクエリを実行すると、クエリ結果にすべての BigQuery ジョブについて 1 秒ごとの実行結果を示す行が 1 行ずつ表示されます。各期間は整数秒の時点で開始し、厳密に 1 秒間継続します。
INFORMATION_SCHEMA.JOBS_TIMELINE_BY_*
ビューのスキーマは次のとおりです。
列名 | データ型 | 値 |
---|---|---|
period_start |
TIMESTAMP |
この期間の開始時間。 |
period_slot_ms |
INTEGER |
この期間に使用したスロットのミリ秒数。 |
period_shuffle_ram_usage_ratio |
FLOAT |
選択した期間のシャッフル使用率。 |
project_id |
STRING |
(クラスタリング列)プロジェクトの ID。 |
project_number |
INTEGER |
プロジェクトの番号。 |
user_email |
STRING |
(クラスタリング列)ジョブを実行したユーザーのメールアドレスまたはサービス アカウント。 |
job_id |
STRING |
ジョブの ID。例: bquxjob_1234 |
job_type |
STRING |
ジョブのタイプ。QUERY 、LOAD 、EXTRACT 、COPY 、または null のいずれかです。ジョブタイプ null は、スクリプト ジョブ ステートメントの評価やマテリアライズド ビューの更新などの内部ジョブを示します。 |
statement_type |
STRING |
クエリ ステートメントのタイプ(有効な場合)。例: SELECT 、INSERT 、UPDATE 、または DELETE 。 |
job_creation_time |
TIMESTAMP |
(パーティショニング列)このジョブの作成時間。パーティショニングは、このタイムスタンプの UTC 時間に基づきます。 |
job_start_time |
TIMESTAMP |
このジョブの開始時間。 |
job_end_time |
TIMESTAMP |
このジョブの終了時間。 |
state |
STRING |
この期間の終了時点におけるジョブの実行状態。有効な状態には PENDING 、RUNNING 、DONE があります。 |
reservation_id |
STRING |
この期間の終了時点でこのジョブに割り当てられているメイン予約の名前(該当する場合)。 |
edition |
STRING |
このジョブに割り当てられた予約に関連付けられているエディション。エディションの詳細については、BigQuery エディションの概要をご覧ください。 |
total_bytes_processed |
INTEGER |
ジョブによって処理された合計バイト数。 |
error_result |
RECORD |
ErrorProto.
としてのエラー(ある場合)の詳細。 |
cache_hit |
BOOLEAN |
このジョブのクエリ結果がキャッシュから取得されたかどうか。 |
period_estimated_runnable_units |
INTEGER |
この期間にすぐにスケジュール設定できる作業単位。予約内の他のクエリで追加のスロットが必要ない場合は、これらの作業単位でスロットを追加することでクエリが高速化されます。 |
データの保持
このビューには、現在実行中のジョブと過去 180 日間のジョブの履歴が含まれます。
スコープと構文
このビューに対するクエリでは、リージョン修飾子を指定する必要があります。リージョン修飾子を指定しない場合、メタデータはすべてのリージョンで取得されます。次の表で、このビューのリージョン スコープを説明します。
ビュー名 | リソース スコープ | リージョン スコープ |
---|---|---|
[PROJECT_ID.]`region-REGION`.INFORMATION_SCHEMA.JOBS_TIMELINE[_BY_PROJECT] |
プロジェクト レベル | REGION |
- 省略可:
PROJECT_ID
: Google Cloud プロジェクトの ID。指定しない場合は、デフォルトのプロジェクトが使用されます。
REGION
: 任意のデータセット リージョン名。例:`region-us`
例
デフォルト プロジェクト以外のプロジェクトに対してクエリを実行するには、次の形式でプロジェクト ID を追加します。
`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
`myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE
。
次の例では、前日における 1 秒ごとのスロット使用率を計算しています。
SELECT period_start, SUM(period_slot_ms) AS total_slot_ms, FROM `reservation-admin-project.region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE WHERE period_start BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) AND CURRENT_TIMESTAMP() GROUP BY period_start ORDER BY period_start DESC;
+---------------------+---------------+ | period_start | total_slot_ms | +---------------------+---------------+ | 2020-07-29 03:52:14 | 122415176 | | 2020-07-29 03:52:15 | 141107048 | | 2020-07-29 03:52:16 | 173335142 | | 2020-07-28 03:52:17 | 131107048 | +---------------------+---------------+
特定の予約の使用状況は WHERE reservation_id = "…"
で確認できます。スクリプト ジョブの場合、親ジョブは子ジョブからのスロットの合計使用状況も報告します。重複してカウントされないように、WHERE statement_type != "SCRIPT"
を使用して親ジョブを除外します。
例: RUNNING
ジョブと PENDING
ジョブの数の推移
デフォルト プロジェクト以外のプロジェクトに対してクエリを実行するには、次の形式でプロジェクト ID を追加します。
`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
`myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE
。
次の例では、前日における 1 秒ごとの RUNNING
ジョブと PENDING
ジョブの数を計算しています。
SELECT period_start, SUM(IF(state = "PENDING", 1, 0)) as PENDING, SUM(IF(state = "RUNNING", 1, 0)) as RUNNING FROM `reservation-admin-project.region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE WHERE period_start BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) AND CURRENT_TIMESTAMP() GROUP BY period_start;
次のような結果になります。
+---------------------+---------+---------+ | period_start | PENDING | RUNNING | +---------------------+---------+---------+ | 2020-07-29 03:52:14 | 7 | 27 | | 2020-07-29 03:52:15 | 1 | 21 | | 2020-07-29 03:52:16 | 5 | 21 | | 2020-07-29 03:52:17 | 4 | 22 | +---------------------+---------+---------+
例: 特定の時点におけるジョブ別のリソース使用量
デフォルト プロジェクト以外のプロジェクトに対してクエリを実行するには、次の形式でプロジェクト ID を追加します。
`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
`myproject`.`region-us`.INFORMATION_SCHEMA.JOBS
。
次の例では、特定の時点で実行されているすべてのジョブの job_id
と、それらのジョブの 1 秒間におけるリソース使用量を返しています。
SELECT job_id, period_slot_ms FROM `reservation-admin-project.region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE_BY_PROJECT WHERE period_start = '2020-07-29 03:52:14' AND statement_type != 'SCRIPT';
次のような結果になります。
+------------------+ | job_id | slot_ms | +------------------+ | job_1 | 2415176 | | job_2 | 4417245 | | job_3 | 427416 | | job_4 | 1458122 | +------------------+
例: 管理リソースグラフからスロット使用状況を照合する
管理リソースグラフを使用すると、組織の健全性、スロットの使用状況、BigQuery ジョブのパフォーマンスを経時的にモニタリングできます。次の例では、スロット使用のタイムラインを確認するために、1 時間間隔で INFORMATION_SCHEMA.JOBS_TIMELINE
ビューに対してクエリを実行します。これにより、管理リソースグラフで入手可能な情報と同様の情報を取得できます。
WITH snapshot_data AS ( SELECT UNIX_MILLIS(period_start) AS period_start, IFNULL(SUM(period_slot_ms), 0) AS period_slot_ms, DIV(UNIX_MILLIS(period_start), 3600000 * 1) * 3600000 * 1 AS time_ms FROM ( SELECT * FROM `user_proj.region-US`.INFORMATION_SCHEMA.JOBS_TIMELINE_BY_ORGANIZATION WHERE ((job_creation_time >= TIMESTAMP_SUB(@start_time, INTERVAL 1200 MINUTE) AND job_creation_time < TIMESTAMP(@end_time)) AND period_start >= TIMESTAMP(@start_time) AND period_start < TIMESTAMP(@end_time)) AND (statement_type != "SCRIPT" OR statement_type IS NULL) AND REGEXP_CONTAINS(reservation_id, "^user_proj:") ) GROUP BY period_start, time_ms ), data_by_time AS ( SELECT time_ms, SUM(period_slot_ms) / (3600000 * 1) AS submetric_value FROM snapshot_data GROUP BY time_ms ) SELECT time_ms, IFNULL(submetric_value, 0) AS submetric_value, "Slot Usage" AS resource_id, IFNULL(SUM(submetric_value) OVER () / (TIMESTAMP_DIFF(@end_time, @start_time, HOUR) / 1), 0) AS overall_average_slot_count FROM ( SELECT time_ms * 3600000 * 1 AS time_ms FROM UNNEST(GENERATE_ARRAY(DIV(UNIX_MILLIS(@start_time), 3600000 * 1), DIV(UNIX_MILLIS(@end_time), 3600000 * 1) - 1, 1)) AS time_ms ) LEFT JOIN data_by_time USING(time_ms) ORDER BY time_ms DESC;