💰

[Databricks]サーバレスコンピュートの料金確認

2024/07/29に公開

はじめに

2024/07の上〜中旬にかけて、AWS/Azureの東京リージョンで、Databricks のサーバレスコンピュート(for インタラクティブなNoteBook/Job)がロールアウトされました👏

サーバレスコンピュートは従来のコンピュートに比べ起動が早く、料金体系もわかりやすくなるメリットがあるので可能な限り活用したいところです。

本稿では、サーバレスコンピュート利用料金の確認方法をみていきます。

Databricksにおける料金確認方法

Databricksにおける利用料金確認方法は大きく2つあります。

  1. アカウントコンソールに準備されたUsageダッシュボードを利用する方法
  2. システムテーブルを利用し、ワークスペースコンソールに自作のクエリ/ダッシュボードを作成する方法

それぞれみていきます。

1. アカウントコンソールに準備されたUsageダッシュボードを利用する方法

アカウントコンソールでは、利用料金を確認するためのUsageダッシュボードが提供されています。

執筆時点では、任意期間の使用量(DBU) もしくは 推定利用料金(USD)の日別推移を、以下3つの観点で確認できます。

  • ワークスペース別
  • SKU別
  • タグ別


アカウントコンソールのUsageダッシュボード:日別推移(公式より引用)

サーバレスコンピュートについては、SKU別の軸でserverless関連項目(例:Premiumプラン/AWS東京リージョンの場合であれば、Premium jobs serverless compute ap tokyo)を確認すればOKです。

また、ワークスペース別/SKU別の使用量(DBU)もしくは推定コスト(USD)の集計値も確認可能です。


アカウントコンソールのUsageダッシュボード

この集計値については、サーバレスコンピュートの値を確認する方法はなさそうです。(執筆時点)
※上記画像にて、Jobs DBUやAll purpose DBUのSKUは確認できるもののserverlessに関するSKUが見当たらない。

アカウントコンソールのUsageダッシュボードでは日別推移/集計値の確認に加え、以下も可能です。

  • 日別推移や利用実績CSVのダウンロード
    • S3などオブジェクトストレージへの配信にも対応しています。
  • ワークスペースダッシュボードへのエクスポート

ワークスペースダッシュボードへエクスポートされたUsageダッシュボードは、後述の2. システムテーブルを利用し、ワークスペースコンソールに自作のクエリ/ダッシュボードを利用する方法と実質的に同等なものとして扱えます。
アカウトコンソールでのUsageダッシュボードに比べ、アカウント管理者権限が不要であることに加え、カスタマイズ可能です。

2. システムテーブルを利用し、ワークスペースコンソールに自作のクエリ/ダッシュボードを利用する方法

ワークスペースコンソールにて、システムテーブルを利用したクエリやダッシュボードを作成することで、使用量(DBU)、利用料金(USD)を確認できます。

使用するシステムテーブルは2つで、各々以下の役割があります。

  • system.billing.usage

    • ユーザの使用実績がレコードとして格納されています。
    • 約1時間ごとにレコードが追加されるようです。
  • system.billing.list_prices

    • SKU別の単価がレコードとして格納されています。
    • 価格が変更されるたびにレコードが追加されます。

利用料金=使用量×単価なので、利用料金を確認するためには、使用量が記録されているusageテーブルと単価が記載されているlist_priceテーブルの2つを使用することになります。

実際のクエリを見ていきましょう。

新規でクエリを作成することもできますが、1. アカウントコンソールに準備されたUsageダッシュボードを利用する方法項の末尾の「アカウントコンソールダッシュボードをインポート」したものや公式ドキュメントのクエリを流用し適宜カスタマイズするのが楽です。

以下は、公式ドキュメントで紹介されている「実行ユーザの直近30日のサーバレス関連利用料金が、設定した予算を超えたか?」を確認するもので、予算を超えた際にアラートを発報することを想定しているようです。※コメントは筆者によるものです。

SELECT
   t1.identity_metadata.run_as, -- run_as=操作実行ユーザ
   SUM(t1.usage_quantity * list_prices.pricing.default) as list_cost -- 利用料金 = 使用量 × 単価 
FROM system.billing.usage t1
INNER JOIN system.billing.list_prices on
   t1.cloud = list_prices.cloud and
   t1.sku_name = list_prices.sku_name and
   t1.usage_start_time >= list_prices.price_start_time and
   (t1.usage_end_time <= list_prices.price_end_time or list_prices.price_end_time is null)
WHERE
   t1.sku_name LIKE '%SERVERLESS%' -- 対象のSKUをサーバレスに限定
   AND billing_origin_product IN ("JOBS", "NOTEBOOKS") -- サーバレスの中でもJOBSとNOTEBOOKSに限定
                                                       -- WARNING: 執筆時点ではノートブック関連のレコードをフィルタしたい場合以下となるような。。。
                                                        -- 誤:"NOTEBOOKS"
                                                        -- 正:"INTERACTIVE"
   AND t1.usage_date >= CURRENT_DATE() - INTERVAL 30 DAYS
GROUP BY
   t1.identity_metadata.run_as -- run_as別の集計(run_as ≒ 操作実行ユーザ)
HAVING
   list_cost > {budget} -- {budget}は自身が設定する予算

ワークスペースコンソールでは、上記のようなクエリを利用し、アラートダッシュボードが作成可能です。詳細は各ドキュメントを参照ください。

また、system.billing.usageテーブルには様々な情報が格納されているので、ドキュメントを参照の上、必要な項目を適宜ご利用ください。

まとめ

1.のアカウントコンソールに準備されたUsageダッシュボードは、デフォルトで提供されているものなので、(権限さえあれば)セットアップ不要で、すぐに利用できるのがメリットです。

一方で、複雑なカスタマイズはできないので、必要に応じて、2.のワークスペースコンソールでシステムテーブルを利用したクエリ/ダッシュボードを使用してください。
複雑なカスタマイズの例としては、複数軸の分析(=ユーザ別かつプロジェクト別の集計。例:ユーザAさんのプロジェクトXでの使用量や利用料金)があります。
このような例の場合は、ワークスペースコンソールに使用量や利用料金確認用のクエリもしくはダッシュボードを用意しておくのが良さそうです。

追記

limited time promotionも考慮された最終的な価格(以降、Promotion適用価格)は、system.billing.list_pricesテーブルのpricingカラムに格納されています。

Promotion適用価格だけを取り出すクエリは以下です。

SELECT pricing.effective_list.default
FROM `system`.`billing`.`list_prices`

注意として、本稿中で紹介している以下の2つは、このPromotion適用価格が考慮されていないようです。

  • 1. アカウントコンソールに準備されたUsageダッシュボードを利用する方法項の末尾の「アカウントコンソールダッシュボードをインポート」したもの
  • 公式ドキュメントのクエリ

例えば、2. システムテーブルを利用し、ワークスペースコンソールに自作のクエリ/ダッシュボードを利用する方法項で引用したクエリに、Promotion適用価格を反映する場合、以下のように変更が必要です。

SELECT
   t1.identity_metadata.run_as, 
   SUM(t1.usage_quantity * list_prices.pricing.effective_list.default) as list_cost -- Promotion適用価格に変更
 --SUM(t1.usage_quantity * list_prices.pricing.default) as list_cost                -- もともとの記述。(Promotion未適用) 
FROM system.billing.usage t1
INNER JOIN system.billing.list_prices on
   t1.cloud = list_prices.cloud and
   t1.sku_name = list_prices.sku_name and
   t1.usage_start_time >= list_prices.price_start_time and
   (t1.usage_end_time <= list_prices.price_end_time or list_prices.price_end_time is null)
WHERE
   t1.sku_name LIKE '%SERVERLESS%' 
   AND billing_origin_product IN ("JOBS", "NOTEBOOKS") -- サーバレスの中でもJOBSとNOTEBOOKSに限定
                                                       -- 注意: 執筆時点ではノートブック関連のレコードをフィルタしたい場合以下となるような。。。
                                                        -- 誤:"NOTEBOOKS"
                                                        -- 正:"INTERACTIVE"
   AND t1.usage_date >= CURRENT_DATE() - INTERVAL 30 DAYS
GROUP BY
   t1.identity_metadata.run_as 
HAVING
   list_cost > {budget} 
SalesNow Tech Blog

Discussion