【Databricks】システムテーブルを調べてみた

# 背景・目的
Databricksのシステムテーブルの情報に触れる機会があったので、整理しました。

# まとめ
システムテーブルは、下記の特徴があります。
- アカウントの運用データが入っています。
- 2023年12月15日現在で、パブリックプレビューです。
- Unity Catalogにより管理されます。
- アカウント管理者がREST APIで有効にします。
- パブリックプレビュー中には、リアルタイム監視はサポートされていない。


# 概要
[システムテーブルによる使用状況の監視](https://docs.databricks.com/en/administration-guide/system-tables/index.html)を基に整理します。

## What are system tables?
> システム テーブルは、Databricks でホストされるアカウントの運用データの分析ストアです。 システムテーブルは、アカウント全体の履歴可観測性に使用できます。

アカウントの運用データが入っている。

### Which system tables are available?
下記のテーブルが、利用できます。詳細は、ドキュメントをご確認ください。


|スキーマ| テーブル名|概要|
|:--|:--|:--|
|access|Audit logs|監査ログ|
||Table lineage|Unity Catalog上のテーブル、パスの読み書きイベントが記録される|
||Column lineage|Unity Catalog上の列の読み下記のイベントが記録される|
|billing|Billable usage|課金利用の記録|
| |Pricing |SKU価格の履歴|
|compute|Clusters|クラスタの時間の経過に伴うクラスター構成の履歴|
||Node types|現在使用可能なノードタイプ、基本的な情報|
|marketplace|Marketplace listing access| リクエストデータのConsumer情報など|
|storage|Predictive optimization|予測最適化機能の操作履歴|

# Enable system tables
> システムテーブルは Unity Catalogによって管理されるため、システムテーブルを有効にしてアクセスするには、アカウントに少なくとも1つの Unity Catalog対応ワークスペースが必要です。 システムテーブルには、アカウント内のすべてのワークスペースのデータが含まれますが、Unity カタログ対応のワークスペースからのみアクセスできます。

- Unity Catalogにより管理される

> システム テーブルは、アカウント管理者が有効にする必要があります。 Unity Catalog REST API を使用してシステム テーブルを有効にすることができます。

- アカウント管理者がREST APIで有効にする

## Limitations
> 現在、システム テーブルのパブリック プレビューには次の制限があります。
> リアルタイム監視はサポートされていません。 データは終日更新されます。 最近のイベントのログが表示されない場合は、後でもう一度確認してください。

- パブリックプレビュー中には、リアルタイム監視はサポートされていない。

# 実践
## 事前確認
1. 有効化前の状態を確認します。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/42547a2f-5df1-ed8f-97f5-05b9d51c8628.png" width=300/>

## 有効化
1. REST APIを実行するためには、管理者アカウントのAccess Tokenを作成しておきます。
1. 下記のコマンドで実行前の状態を確認してみます。
    - PAT Token：自身のAccess Token
    - workspace：対象のワークスペース
    - metastore-id：メタストアID（s3パスに書いてあります。）
    ```
    curl -v -X GET -H "Authorization: Bearer <PAT Token>" "https://<workspace>.cloud.databricks.com/api/2.0/unity-catalog/metastores/<metastore-id>/systemschemas" | jq
    ```
1. 下記の結果が返されました。information_schemaのみが、ENABLE_COMPLETEDとなっていました。ドキュメントを読むと、ENABLE_COMPLETEDがカタログエクスプローラーに表示されるようです。また、AVAILABLEが、使用可能だが、有効にはなっていないようです。

    ```
    * Connection #0 to host XXXX left intact
    {
      "schemas": [
        {
          "schema": "storage",
          "state": "AVAILABLE"
        },
        {
          "schema": "access",
          "state": "AVAILABLE"
        },
        {
          "schema": "billing",
          "state": "AVAILABLE"
        },
        {
          "schema": "compute",
          "state": "AVAILABLE"
        },
        {
          "schema": "marketplace",
          "state": "AVAILABLE"
        },
        {
          "schema": "operational_data",
          "state": "UNAVAILABLE"
        },
        {
          "schema": "information_schema",
          "state": "ENABLE_COMPLETED"
        }
      ]
    }
    $ 
    ```
1. 下記のコマンドで有効化します。まずは、accessスキーマを指定します。HTTPステータス200を返しました。
    ```
    curl -v -X PUT -H "Authorization: Bearer <PAT Token>" "https://<workspace.databricks.com/api/2.0/unity-catalog/metastores/<metastore-id>/systemschemas/access"
    ```
1. 再び確認してみます。accessスキーマが有効になりました。
    ```
    {
      "schemas": [
        {
          "schema": "storage",
          "state": "AVAILABLE"
        },
        {
          "schema": "access",
          "state": "ENABLE_COMPLETED"
        },
        {
          "schema": "billing",
          "state": "AVAILABLE"
        },
        {
          "schema": "compute",
          "state": "AVAILABLE"
        },
        {
          "schema": "marketplace",
          "state": "AVAILABLE"
        },
        {
          "schema": "operational_data",
          "state": "UNAVAILABLE"
        },
        {
          "schema": "information_schema",
          "state": "ENABLE_COMPLETED"
        }
      ]
    }
    ```
1. カタログエクスプローラーも確認します。見えました。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b2bf4558-48b2-cac4-0cf5-0a8ec3b29e60.png" width=300 />

1. 残りも有効化します。operational_dataは、UNAVAILABLEですが、一応試してみます。
    ```
    for schema in storage billing compute marketplace operational_data;do curl -v -X PUT -H "Authorization: Bearer $TOKEN" "https://XXXXXX.cloud.databricks.com/api/2.0/unity-catalog/metastores/XXXXXXXX/systemschemas/$schema";done
    ```
1. 下記の結果が返されました。やはりoperational_dataは有効化出来ませんでした。また、storageとcomputeでが有効にできずエラーになってしまいました。
    ```
    {"error_code":"SCHEMA_DOES_NOT_EXIST","message":"Schema 'system.storage' does not exist.","details":XXXXX ・・・・
    {"error_code":"TABLE_DOES_NOT_EXIST","message":"Table 'system.compute.node_timeline' does not exist.","details":XXXX ・・・
    {"error_code":"INTERNAL_ERROR","message":"System schema \"operational_data\" is not currently available for enablement","details":XXXXX ・・・
    ```

1. 再び確認してみます。下記が返されました。storageとcomputeがENABLE_INITIALIZEDになっていました。
    ```
    {
      "schemas": [
        {
          "schema": "storage",
          "state": "ENABLE_INITIALIZED"
        },
        {
          "schema": "access",
          "state": "ENABLE_COMPLETED"
        },
        {
          "schema": "billing",
          "state": "ENABLE_COMPLETED"
        },
        {
          "schema": "compute",
          "state": "ENABLE_INITIALIZED"
        },
        {
          "schema": "marketplace",
          "state": "ENABLE_COMPLETED"
        },
        {
          "schema": "operational_data",
          "state": "UNAVAILABLE"
        },
        {
          "schema": "information_schema",
          "state": "ENABLE_COMPLETED"
        }
      ]
    }
    $
    ```

1. 再び、カタログエクスプローラーを確認します。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9ec41e11-3294-3bd1-b9bf-94a240a22f28.png" width=300 />

1. テーブルも見えました。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ebc0a941-956c-8c82-4ee6-b0307a421c87.png" width=300 />

# データの確認
1. list_pricesのテーブル定義を確認します。
    ```
    DESC system.billing.list_prices
    ```
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7c3a28b5-31bf-1bf9-7122-7d571b425a42.png" width=500 />

1. SELECTします。価格が確認できました。
    ```
      SELECT price_start_time,price_end_time,sku_name,currency_code,usage_unit,pricing 
        FROM system.billing.list_prices  
    ORDER BY price_start_time DESC
    ```

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a8950eec-3469-d694-c386-233c0e2e6063.png)

# 考察
今回は、Databricksのシステムテーブルを確認しました。
一部、compute,storageスキーマが確認できませんでしたが、マニュアルなど探してみましたが詳細にはわかりませんでした。今後、調査してみようと思います。


# 参考
https://docs.databricks.com/en/administration-guide/system-tables/index.html