0
1

Databricksのコンピュートシステムテーブルによるクラスター使用率の監視

Posted at

Databricksの様々なメトリクスにクイックにアクセスできるシステムテーブル、これまでにも監査用データや課金データなどにアクセスすることができていました。

ここ最近でも様々なメトリクスが追加されています。

そして最近では、コンピュートシステムテーブルsystem.computeが追加されました。こちらのシステムテーブルでは、all-purposeクラスターやjobsクラスターのアクティビティやメトリクスを監視できるようになります。

  • clusters: コンピュート設定をアカウントに記録します。
  • node_types: ハードウェア情報を含む、現在使用可能なノード タイプごとに 1 つのレコードが含まれます。
  • node_timeline: コンピュートの使用状況メトリクスの分単位の記録が含まれます。

clustersはクラスターの設定を記録し、node_typesにはアカウントで利用できるノードタイプの一覧が記録され、node_timelineにはクラスターのノードレベルでの使用状況が記録されることになります。個人的には、リソースの利用状況をモニタリングできるのでnode_timelineが嬉しいです。

computeシステムテーブルの有効化

早速、Databricks SDKを使って有効化します。

%pip install databricks-sdk --upgrade
dbutils.library.restartPython()
from databricks.sdk import WorkspaceClient
w = WorkspaceClient()

for schema in w.system_schemas.list(w.metastores.current().metastore_id):
  print(f"スキーマ名: {schema.schema}, 状態: {schema.state}")
スキーマ名: storage, 状態: SystemSchemaInfoState.AVAILABLE
スキーマ名: access, 状態: SystemSchemaInfoState.ENABLE_COMPLETED
スキーマ名: billing, 状態: SystemSchemaInfoState.ENABLE_COMPLETED
スキーマ名: compute, 状態: SystemSchemaInfoState.AVAILABLE
スキーマ名: marketplace, 状態: SystemSchemaInfoState.AVAILABLE
スキーマ名: query, 状態: SystemSchemaInfoState.ENABLE_COMPLETED
スキーマ名: lakeflow, 状態: SystemSchemaInfoState.AVAILABLE
スキーマ名: operational_data, 状態: SystemSchemaInfoState.UNAVAILABLE
スキーマ名: lineage, 状態: SystemSchemaInfoState.UNAVAILABLE
スキーマ名: information_schema, 状態: SystemSchemaInfoState.ENABLE_COMPLETED

SystemSchemaInfoState.AVAILABLEになっているので有効化できます。

w.system_schemas.enable(metastore_id=w.metastores.current().metastore_id, schema_name="compute")

有効化されていることを確認します。

from databricks.sdk import WorkspaceClient
w = WorkspaceClient()

for schema in w.system_schemas.list(w.metastores.current().metastore_id):
  print(f"スキーマ名: {schema.schema}, 状態: {schema.state}")
スキーマ名: storage, 状態: SystemSchemaInfoState.AVAILABLE
スキーマ名: access, 状態: SystemSchemaInfoState.ENABLE_COMPLETED
スキーマ名: billing, 状態: SystemSchemaInfoState.ENABLE_COMPLETED
スキーマ名: compute, 状態: SystemSchemaInfoState.ENABLE_COMPLETED
スキーマ名: marketplace, 状態: SystemSchemaInfoState.AVAILABLE
スキーマ名: query, 状態: SystemSchemaInfoState.ENABLE_COMPLETED
スキーマ名: lakeflow, 状態: SystemSchemaInfoState.AVAILABLE
スキーマ名: operational_data, 状態: SystemSchemaInfoState.UNAVAILABLE
スキーマ名: lineage, 状態: SystemSchemaInfoState.UNAVAILABLE
スキーマ名: information_schema, 状態: SystemSchemaInfoState.ENABLE_COMPLETED

SystemSchemaInfoState.ENABLE_COMPLETEDになっているので有効化されています。カタログエクスプローラでも確認できます。

Screenshot 2024-08-28 at 18.24.17.png
Screenshot 2024-08-28 at 18.25.11.png

サンプルクエリー

マニュアルにあるクエリーを実行していきます。

クラスターレコードを最新の請求レコードと結合する

%sql
SELECT
  u.record_id,
  c.cluster_id,
  c.owned_by,
  c.change_time,
  u.usage_start_time,
  u.usage_quantity
FROM
  system.billing.usage u
  JOIN system.compute.clusters c
  JOIN (SELECT u.record_id, c.cluster_id, max(c.change_time) change_time
    FROM system.billing.usage u
    JOIN system.compute.clusters c
    WHERE
      u.usage_metadata.cluster_id is not null
      and u.usage_start_time >= '2023-01-01'
      and u.usage_metadata.cluster_id = c.cluster_id
      and date_trunc('HOUR', c.change_time) <= date_trunc('HOUR', u.usage_start_time)
    GROUP BY all) config
WHERE
  u.usage_metadata.cluster_id is not null
  and u.usage_start_time >= '2023-01-01'
  and u.usage_metadata.cluster_id = c.cluster_id
  and u.record_id = config.record_id
  and c.cluster_id = config.cluster_id
  and c.change_time = config.change_time
ORDER BY cluster_id, usage_start_time desc;

クラスターごとのDBU消費を確認することができます。
Screenshot 2024-08-28 at 18.26.48.png
Screenshot 2024-08-28 at 18.28.40.png

コストをクラスター所有者に帰属させる

%sql
SELECT
  u.record_id record_id,
  c.cluster_id cluster_id,
  max_by(c.owned_by, c.change_time) owned_by,
  max(c.change_time) change_time,
  any_value(u.usage_start_time) usage_start_time,
  any_value(u.usage_quantity) usage_quantity
FROM
  system.billing.usage u
  JOIN system.compute.clusters c
WHERE
  u.usage_metadata.cluster_id is not null
  and u.usage_start_time >= '2023-01-01'
  and u.usage_metadata.cluster_id = c.cluster_id
  and c.change_time <= u.usage_start_time
GROUP BY 1, 2
ORDER BY cluster_id, usage_start_time desc;

Screenshot 2024-08-28 at 18.29.40.png

平均使用率とピーク使用率が最も高いコンピュート リソースを特定する

オリジナルから若干変更しています。

%sql
SELECT
        distinct cluster_id,
driver,
avg(cpu_user_percent + cpu_system_percent) as `Avg CPU Utilization`,
max(cpu_user_percent + cpu_system_percent) as `Peak CPU Utilization`,
        avg(cpu_wait_percent) as `Avg CPU Wait`,
        max(cpu_wait_percent) as `Max CPU Wait`,
        avg(mem_used_percent) as `Avg Memory Utilization`,
        max(mem_used_percent) as `Max Memory Utilization`,
avg(network_received_bytes)/(1024^2) as `Avg Network MB Received per Minute`,
avg(network_sent_bytes)/(1024^2) as `Avg Network MB Sent per Minute`
FROM
        system.compute.node_timeline
WHERE
        start_time >= date_add(now(), -100)
GROUP BY
        cluster_id,
        driver
ORDER BY
        3 desc;

Screenshot 2024-08-28 at 18.30.51.png

特定のクラスターの利用状況

シンプルなSQLで簡単に可視化できます。

SELECT
  *
FROM
  node_timeline
WHERE
  cluster_id = "1118-004519-nu0u899x"

Screenshot 2024-08-28 at 18.38.43.png
Screenshot 2024-08-28 at 18.39.23.png

さらにクエリーを洗練させることで起動しているがほとんど使われていないクラスターヘビーに使用されているクラスターを特定することもできます。是非ご活用ください

はじめてのDatabricks

はじめてのDatabricks

Databricks無料トライアル

Databricks無料トライアル

0
1
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
0
1