【Databricks】Lakehouse Monitoringを試してみた

# 背景・目的
[Introduction to Databricks Lakehouse Monitoring](https://docs.databricks.com/en/lakehouse-monitoring/index.html)について、どのようなものか整理し、簡単に試してみます。

# まとめ
- Lakehouse Monitoringでは、３つのプロファイルがある
    - 時系列
    - スナップショット
    - 推論
- アカウント内のすべてのテーブルのデータの統計プロパティと品質を監視できます。
- パフォーマンスの変化を検出すると、レイクハウスモニタリングによって作成されたテーブルが変更をキャプチャしてアラートを上げることが可能です。
- 2023/12/30現在、Public Previewです。

# 概要
## Databricks レイクハウスモニタリングの概要
[Databricks レイクハウスモニタリングの概要](https://docs.databricks.com/ja/lakehouse-monitoring/index.html)を元に整理します。

> Databricks レイクハウス モニタリングを使用すると、アカウント内のすべてのテーブルのデータの統計プロパティと品質を監視できます。 また、これを使用して、モデルの入力と予測を含む推論テーブルを監視することで、機械学習モデルとモデルサービングエンドポイントのパフォーマンスを追跡することもできます。 この図は、Databricks のデータと機械学習パイプラインを介したデータのフローと、モニタリングを使用してデータ品質とモデルのパフォーマンスを継続的に追跡する方法を示しています。

- アカウント内のすべてのテーブルのデータの統計プロパティと品質を監視できる。
- モデルの入力と予測を含む推論テーブルを監視し、モデルとモデルサービングエンドポイントのパフォーマンスを追跡できる
- 下記の図は、MLシステムにおけるデータフローとモデルのモニタリングを説明している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a107de95-8a53-3ead-9265-c10c44e707b1.png)

## Databricks レイクハウス モニタリングを使用する理由
> データから有用な知見を引き出すには、データの品質に自信を持っている必要があります。 モニタリングデータでは、データの品質と一貫性を経時的に追跡および確認するのに役立つ定量的な測定値が提供されます。 テーブルのデータ分布または対応するモデルのパフォーマンスの変化を検出すると、Databricks レイクハウス モニタリングによって作成されたテーブルが変更をキャプチャしてアラートし、原因を特定するのに役立ちます。

- インサイトを出すには、データ品質が重要
- モニタリングデータでは、データの品質と一貫性を経時的に追跡、確認するために役立つ定量的な測定値が提供される
- パフォーマンスの変化を検出すると、レイクハウスモニタリングによって作成されたテーブルが変更をキャプチャしてアラートを上げる

> Databricks レイクハウス モニタリングは、次のような質問に答えるのに役立ちます。
> - データ完全性はどのように見え、時間とともにどのように変化しますか? たとえば、現在のデータの null 値または 0 値の割合はどのくらいで、増加していますか?
> - データの統計分布はどのように表示され、時間の経過とともにどのように変化しますか? たとえば、数値列の90パーセンタイルは何ですか? または、カテゴリ列の値の分布は何ですか、そしてそれは昨日とどう違うのですか?
> - 現在のデータと既知のベースラインの間、またはデータの連続する時間枠の間にドリフトがありますか?
> - データのサブセットまたはスライスの統計的分布またはドリフトはどのように見えますか?
> - 機械学習モデルの入力と予測は時間の経過とともにどのように変化していますか?
> - モデルのパフォーマンスは時間の経過と共にどのように推移していますか? モデル バージョン A のパフォーマンスはバージョン B よりも優れていますか?

> さらに、Databricks レイクハウス モニタリングを使用すると、観測の時間粒度を制御し、カスタム メトリクスを設定できます。

## 要件
> Databricks Lakehouse モニタリングを使用するには、次のものが必要です。
> - ワークスペースで Unity Catalog を有効にし、Databricks SQL にアクセスできる必要があります。
> - モニタリングでは、Delta マネージド テーブル、外部テーブル、ビュー、および具体化されたビューのみがサポートされています。

- Unity catalog
- SQL Warehouse
- Deltaマネージドテーブルと、外部テーブル、ビュー、materialized views

## レイクハウスモニタリングが Databricksでどのように機能するか
> Databricks でテーブルを監視するには、テーブルにアタッチされたモニターを作成します。 機械学習モデルのパフォーマンスを監視するには、モデルの入力と対応する予測を保持する推論テーブルにモニターをアタッチします。

- テーブルを監視するには、テーブルにアタッチされたモニターを作成する
- MLモデルのパフォーマンスを監視するには、モデルの入力と対応する予測を保持する推論テーブルをアタッチする

> Databricks レイクハウス モニタリングには、時系列、スナップショット、推論の種類の分析が用意されています。

| プロファイルのタイプ|説明|
|:--|:--|
|時系列|タイムウィンドウでのデータ分布を比較する。メトリクスを計算する粒度（1日など）を指定し、時間の経過に伴うデータ分布の変化を比較する。タイムスタンプ列が必要。|
|スナップショット|テーブルの間z年あ内容が時間の経過とともにどのように変化するか監視する。<BR>メトリクスはテーブル内のすべてのデータに対して計算され、モニターが更新されるたびにテーブルの状態を監視する|
|推論|機械学習の分類モデル、回帰モデルにより出力された予測値を含むテーブル。モデル品質のモデルも含む|

> このセクションでは、Databricks レイクハウス モニタリングで使用される入力テーブルと、それが生成するメトリクス テーブルについて簡単に説明します。 この図は、入力テーブル、メトリクステーブル、モニター、およびダッシュボードの関係を示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/590154dc-210f-1086-18b6-e3f696c3590f.png)

### 主表とベースライン表
> 「プライマリ テーブル」と呼ばれる監視対象のテーブルに加えて、必要に応じて、ドリフトまたは時間の経過に伴う値の変化を測定するための参照として使用するベースライン テーブルを指定できます。 ベースライン テーブルは、データがどのようになるかを示すサンプルがある場合に便利です。 アイデアは、ドリフトが期待されるデータ値と分布に対してコンピュートになるということです。

- 監視対象テーブル=プライマリーテーブル
- ベースラインテーブル＝ドリフトまたは時間の経過に伴う値の変化を測定するための参照として使用
    - データがどのようになるかを示すサンプルがある場合に便利


> ベースライン テーブルには、統計分布、個々の列の分布、欠損値、およびその他の特性の観点から、入力データの予想される品質を反映するデータセットが含まれている必要があります。 監視対象テーブルのスキーマと一致する必要があります。 例外は、時系列プロファイルまたは推論プロファイルで使用されるテーブルのタイムスタンプ列です。 主表またはベースライン表のいずれかで列が欠落している場合、モニタリングはベストエフォート型ヒューリスティックを使用して出力メトリクスをコンピュートします。

- ベースラインテーブルは、統計分布、個々の列の分布、欠損値等の観点から、入力データの予測される品質をハネイするデータセットが含まれている必要がある。
- 監視対象テーブルのスキーマと一致する必要がある
- モニタリングはベストエフォート型ヒューリスティックを使用する

> スナップショット プロファイルを使用するモニターの場合、ベースライン テーブルには、分布が許容可能な品質基準を表すデータのスナップショットが含まれている必要があります。 たとえば、成績分布データでは、成績が均等に分布している前のクラスにベースラインを設定できます。

- スナップショットプロファイルを使用するモニターの場合、ベースラインテーブルには、分布が許容可能な品質基準を表すデータのスナップが含まれている必要がある

> 時系列プロファイルを使用するモニターの場合、ベースライン テーブルには、データ分布が許容可能な品質基準を表すタイム ウィンドウを表すデータが含まれている必要があります。 たとえば、気象データでは、気温が予想される通常の気温に近い週、月、または年にベースラインを設定できます。

- 時系列プロファイルの場合、ベースラインテーブルには、データ分布が許容可能な品質基準を表すタイムウィンドウを表すデータが含まれている必要がある。

> 推論プロファイルを使用するモニターの場合、ベースラインに適した選択は、監視対象のモデルのトレーニングまたは検証に使用されたデータです。 このようにして、モデルがトレーニングおよび検証された内容に対してデータがドリフトしたときに、ユーザーにアラートを受け取ることができます。 このテーブルには、プライマリテーブルと同じ特徴列が含まれている必要があり、さらに、データが一貫して集計されるように、プライマリテーブルの InferenceLog に指定されたものと同じ model_id_col が必要です。 理想的には、モデルの評価に使用されるテストまたは検証セットを使用して、同等のモデル品質を確保する必要があります メトリクス。


- 推論プロファイルの場合、監視対象のモデルのトレーニングまたは検証に使用されたデータ
- ドリフトしたときに、アラートを出す。

### メトリクス テーブルとダッシュボード
> テーブルモニターは、2 つのメトリクステーブルとダッシュボードを作成します。 メトリック値は、テーブル全体、およびモニターの作成時に指定するタイム ウィンドウとデータ サブセット (または「スライス」) のコンピュートです。 また、推論分析のために、メトリクスはモデルID毎にコンピュートされる。 メトリクステーブルの詳細については、「 メトリクステーブルのモニター」を参照してください。
> - プロファイル メトリクス テーブルには、要約統計量が含まれています。 プロファイル メトリクス テーブル スキーマを参照してください。
> - ドリフトメトリクステーブルには、時間の経過に伴うデータのドリフトに関連する統計が含まれています。 ベースライン テーブルが指定されている場合、ベースライン値に対するドリフトも監視されます。 ドリフトメトリクステーブルのスキーマを参照してください。

> メトリクステーブルは Delta テーブルであり、指定した Unity Catalog スキーマに格納されます。 これらのテーブルは、Databricks UI を使用して表示したり、Databricks SQL を使用してクエリを作成したり、それらに基づいてダッシュボードとアラートを作成したりできます。

> モニターごとに、Databricks によってダッシュボードが自動的に作成され、モニターの結果を視覚化して表示するのに役立ちます。 ダッシュボードは、他の Databricks SQL ダッシュボードと同様に完全にカスタマイズできます。



# 実践
## 事前準備
1. メトリクス用のカタログと、スキーマを作成します。
    ```
    CREATE CATALOG metrics;
    
    CREATE SCHEMA metrics.monitoring;
    ```

## Databricks UIを使用したモニターの作成
[Databricks UIを使用したモニターの作成](https://docs.databricks.com/ja/lakehouse-monitoring/create-monitor-ui.html)を元に試してみます。

ここでは、スナップショットプロファイルで試します。

1. ワークスペースにサインインします。
1. ナビベーションペインで「Catalog」をクリックします。
1. 任意のテーブルを選択します。なお、このテーブルは、[こちら](https://qiita.com/zumax/items/cbd9afb8924e2284ee4f#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90)で作成したものです。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9bdd665c-cfd1-17fa-53be-6512121086e7.png)

1. ①「Quality」タブをクリックし、②「Get started」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8527282d-9fba-b568-d40d-b331aed84e7b.png)

1. 下記を入力し、「Create」をクリックします。
    - Profiling:Snapshot profiles
    - Schedule:Refresh manually
    - Metric tables schema name:
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2bb8b211-8ab0-c1f4-6930-417fb2bae4af.png)

1. 作成後、「Profile」のテーブルをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2be5c270-72ea-6213-1fc6-2a0a83c29587.png)

1. テーブルができています。「Sample Data」タブをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/dfa23dbc-f5bd-9d3d-3b6e-5544a331830f.png)
1. データは作られているようです。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ab08a3cc-0d14-7f95-2660-7b98a63cd4cf.png)

1. テーブルに戻り、「Quality」タブの「View dashboard」をクリックします。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5fa1ef58-f463-0142-bea0-9dcd9e729c03.png)


1. customers Monitoringというダッシュボードが作られていました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d1df495b-4d2f-340d-09d7-30586dd8f40b.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/910db8a8-d852-7124-5d5f-17930983cf33.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/881332ad-5412-b05c-4d7d-1893ff3a4c26.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6eba3dee-82d4-3771-cc11-c7987b1b9244.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/bfbc40e3-6a96-0085-14b0-be16f8d7eede.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/faee6911-d082-27fe-fd90-165b4aa1376b.png)

## データを登録し、モニタリングの変化を確認する
1. 下記のクエリでデータを登録します。空白とNULLを仕込んでみます。
    ```
    --顧客
    INSERT INTO test.retail.customers (customer_id, name, address, phone)
    VALUES
    (3, 'Sato', '千葉県',''),
    (4, '木村','' , '080-YYY-YYYY'),
    (5,'吉田','埼玉県',NULL);
    ```

1. 下記のクエリで、データの中身を確認します。
    ```
    SELECT * FROM test.retail.customers
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d8550b49-0052-2167-3ad8-53a5c1c13f2a.png)

1. テーブルのQualityで「Refresh metrics」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0edff1a0-7cc4-96da-6313-a601b3cf37c9.png)

1. View refresh historyをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5774d293-ba95-e07c-8a30-09128425388f.png)

1. refreshの履歴が確認できます。二回ほどクリックしたのでPendingになっています。また以前は、リフレッシュに5mから8mほどかかっているようでした。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4b10188d-65da-1967-e6a2-0e60f6bfd56c.png)

1. refreshされました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8fb19ea9-982d-2a6e-51a5-3ff3d364c45d.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d5096542-e23f-8d19-1c26-36deb75b44a7.png)

1. Monitoringのダッシュボードで「Refresh」をクリックします。
1. 結果は下記のとおりです。
    - Row countが2から5になりました。
    - 1つのカラムがNULLの割合が高くなりました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3a70e395-b4f5-e3f6-c778-0f3027cb7351.png)
    - 時間の経過とともにレコードやカラムの状態がわかります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/932000f8-672a-9210-fbe5-f8ab551f4b43.png)
    - カラムに「phone」を指定します。percet nullの値が 20%に増えたのがわかります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/365cf904-1971-b8b7-234c-12e19f3330ae.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/44b19fcf-d191-1502-892f-422404483946.png)
    - MetricにMedianを指定します。時系列で変化しました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4069797a-04e8-8af2-566f-9f3faa9e7068.png)
    - Time seriesでは、nameの平均文字列長が短くなっていることがわかります。
    - Distribution for inspection timeでは、計測ごとに、nameの件数の変化がわかります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8ae7cd45-253d-c950-3895-40304bb17ca8.png)
    
# 考察
今回、Lakehouse Monitoringを試してみました。データの内容をモニタリングでき、データ品質管理に役立ちそうです。今後はアラートの設定など試してみたいと思います。

# 参考
https://docs.databricks.com/en/lakehouse-monitoring/index.html

https://docs.databricks.com/ja/lakehouse-monitoring/create-monitor-ui.html

https://qiita.com/zumax/items/cbd9afb8924e2284ee4f#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90


https://docs.databricks.com/ja/lakehouse-monitoring/monitor-alerts.html