[2024/12版] Unity Catalogセットアップガイド

過去に以下のような記事を書きました。

https://qiita.com/taka_yayoi/items/6c6f3a2e6febd9e0a451

https://qiita.com/taka_yayoi/items/a9b45ca4197933b12ed2

例によってアドベントカレンダーということもあり、改めて現時点でのセットアップの方法をウォークスルーします。前回との大きな変更点は、後述する[Unity Catalogの自動有効化](#unity-catalogの自動有効化)です。こちらの挙動を理解した上で、要件に合わせたセットアップが必要となります。

スライドにもまとめました。

<script defer class="speakerdeck-embed" data-id="6412182e0fa84d51a1668e71a321d342" data-ratio="1.7777777777777777" src="//speakerdeck.com/assets/embed.js"></script>

# Unity Catalogとは

DatabricksはデータとAIのガバナンスを統合します。Databricksで取り扱う、データベースやテーブル、ファイルや機械学習モデルなどに対するガバナンスを集中管理することができます。

![Screenshot 2024-12-11 at 15.57.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4b7b7dd2-dbe0-fcba-8d8a-2b1896017748.png)

ガバナンス機能の中核となるのが、[Unity Catalog](https://www.databricks.com/jp/product/unity-catalog)です。データ資産、AI資産のアクセスコントロール、監査、リネージ(依存関係)、検索、監視、共有などの機能を提供します。

![Screenshot 2024-12-11 at 15.57.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4a4255a8-0ffd-cfd5-ea7b-d71c2fd0cbd3.png)

# Unity Catalogの自動有効化

冒頭の記事を書いた頃は、Databricksアカウントレベルでの手動によるUnity Catalogの有効化が必要でした。しかし、2023/11以降はUnity Catalogが自動で有効化されるようになっています。

## メリット

- 新規ワークスペースは**Unity Catalog(UC)へのアクセスが事前設定されて提供**されるので、アセットのガバナンスがデフォルトで確保されます。
- アカウント管理者に**連絡する必要なし**にワークスペースの**利用を開始**できます。
- Unity Catalogをベースとする**最新のDatabricks機能**にアクセスできます。
- Hiveサポートを含む**UC以前のワークロードとの完全互換性があります**。

## 自動有効化の概要

![Screenshot 2024-12-11 at 16.02.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/49065f33-6027-2589-4df7-157a7408dada.png)

1. ワークスペースを作成するとワークスペースでUCが自動で有効化されます。
1. ワークスペース専用の[カタログ](https://docs.databricks.com/ja/catalogs/index.html)が自動で作成されます。
1. ワークスペース管理者が上記カタログの所有者になります。
1. 従来のHiveメタストアのサポートには変更はありません。

## 動作原理

1. あるリージョンに最初のワークスペースが作成されると、それとともに**自動でメタストアも作成されます**。自動作成されたメタストアには、ワークスペース分離を維持するために、**[ルートストレージ](https://docs.databricks.com/ja/data-governance/unity-catalog/get-started.html#metastore-storage)や[メタストア管理者](https://docs.databricks.com/ja/data-governance/unity-catalog/manage-privileges/admin-privileges.html#metastore-admins)は設定されません**。
    ![Screenshot 2024-12-11 at 16.14.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/076507cb-66ea-209a-6fef-e8b12e26b1c0.png)
1. 新規ワークスペースは同じリージョンのUCメタストアに**自動でアタッチ**されます。
    ![Screenshot 2024-12-11 at 16.15.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/812e8e1e-f158-67fc-6373-a74f2ebb71bf.png)
1. ワークスペースとともに、ワークスペース名のついた**事前設定済みのカタログ**が提供されます。カタログはデフォルトでワークスペースに**アタッチ**されており、アクセスを明示的に解放しない限り、当該ワークスペースからしかアクセスできないことを意味します。
    ![Screenshot 2024-12-11 at 16.18.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/06c93625-ad23-dd42-6ff2-ea3f67e744ef.png)
1. **ワークスペース管理者は上記のカタログの所有権を持ち**、UCで新規カタログ、ロケーション、コネクション、その他のルートレベルのオブジェクトを作成することができます。
    ![Screenshot 2024-12-11 at 16.18.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/30dae059-7f97-98e8-fccb-19766e803d57.png)
1. このカタログはワークスペース専用のストレージを使用します:
    - Azure - DBFSに隣接する新規コンテナ
    - AWS - ワークスペースストレージ配下で分離されたプレフィクス

    ![Screenshot 2024-12-11 at 16.19.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/afd94559-4d79-430b-89f9-4c1b78a4da25.png)

1. ユーザーがカタログ/スキーマを指定せずに`CREATE TABLE myTable`を実行した場合、`default`として設定されているカタログにテーブルが作成されます。これは、`workspace default catalog`という新たなワークスペース設定で制御されます。従来のHiveメタストアを使い続けたい場合には、この設定を変更します。
    ![Screenshot 2024-12-11 at 16.19.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c84db85a-164b-9899-d4f1-8c6b2da410d6.png)

| コンポーネント | 以前のリリース | UC自動有効化 |
|:--|:--|:--|
| Unity Catalog  | ワークスペース作成後にアカウント管理者によって有効化  | ワークスペース作成時に自動で有効化  |
| Hiveメタストア  | それぞれのワークスペースで自身のHiveメタストアを保持   | それぞれのワークスペースで自身のHiveメタストアを保持  |
| ID管理  |  ワークスペースごとのID管理システム、ローカルグループ | [アイデンティティフェデレーション](https://docs.databricks.com/ja/administration-guide/users-groups/index.html#how-do-admins-assign-users-to-workspaces), アカウントグループ (アカウント管理者、ワークスペース管理者によって作成)  |
| デフォルトのカタログ  | Hive  | UI/APIで設定可能 (UCカタログかHiveを選択可能)  |
| UCメタストアのストレージルートとメタストア管理者  |  必須 | オプション (分散ガバナンスをサポート)  |
| UCストレージ資格情報の作成  | アカウント管理者のみ  |  アカウント管理者、メタストア管理者、ワークスペース管理者、CREATE STORAGE CREDENTIAL権限を持つユーザー  |
| UCカタログ作成(コネクション、外部ロケーション、共有にも適用)  |  メタストア管理者、CREATE CATALOG権限を持つユーザー  | メタストア管理者、ワークスペース管理者、CREATE CATALOG権限を持つユーザー   |

# 注意点

UCが自動有効化されたワークスペースで新規にカタログを作成する際には**ストレージの指定**が必要です。

- 前提として、Unity Catalogではカタログやスキーマ(データベース)が使用する**ストレージ**(S3バケットやADLSコンテナ)が必要となります。
- 新規にワークスペースを作成し、Unity Catalogが自動で有効化されると、自動で当該ワークスペース専用の[**(マネージド)ストレージ**](https://docs.databricks.com/ja/connect/unity-catalog/cloud-storage/managed-storage.html#what-is-a-managed-storage-location)が作成され、その**ストレージ**を使用する当該ワークスペース専用のカタログが自動で作成されます。
- しかし、別途カタログを作成する場合には、**上のステップで作成済みのストレージあるいは新規のストレージを使用するように明示的に指示**する必要があります。ストレージを指定せずにカタログを作成しようとすると以下のエラーメッセージに遭遇します。

> Metastore storage root URL does not exist. Please provide a storage location for the catalog (for example 'CREATE CATALOG myCatalog MANAGED LOCATION '<location-path>'). Alternatively set up a metastore root storage location to provide a storage location for all catalogs in the metastore.

そして、ストレージを指定する際には[**データ分離ポリシー**](https://docs.databricks.com/ja/data-governance/unity-catalog/best-practices.html#plan-your-data-isolation-model)を検討する必要があります。

- ストレージは、メタストアレベル、カタログレベル、スキーマレベルで指定することができます。レベルに応じたデータ分離が行われます。
- テーブルのストレージロケーション(場所)は、どのレベルのストレージが設定されているのかによって、以下の順序で決定されます。
    1. スキーマにストレージロケーションが設定されている場合、テーブルは**スキーマのストレージロケーション**に格納されます。
    1. カタログにストレージロケーションが設定されている場合、テーブルは**カタログのストレージロケーション**に格納されます。
    1. カタログにもストレージロケーションが設定されていない場合、テーブルは**メタストアのストレージロケーション**に格納されます。

データ分離の観点では、メタストアのデフォルトロケーションにカタログ/スキーマを格納しないことを[強くお勧めします](https://docs.databricks.com/ja/data-governance/unity-catalog/best-practices.html#physically-separate)。メタストアのデフォルトロケーションが存在すると、ストレージを指定しなくてもカタログやスキーマを作成することができ、データの分離が行えなくなります。そうではなく、カタログごとの個別のマネージドストレージロケーションを指定しましょう(これがカタログ内のスキーマ/テーブルのデフォルトロケーションになります)。



![Screenshot 2024-12-11 at 16.31.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bef17b78-ec05-1ba8-b58b-0a72c86cdda9.png)

:::note info
**注意**
上記の推奨事項はデータ分離の要件に基づくものです。サンドボックス環境などデータ分離の要件が弱い場合には、環境構築の容易さからメタストアでデフォルトストレージロケーションを指定することには合理性があると言えます。
:::

# Unity Catalogセットアップガイド

以下では、Databricksワークスペース作成完了後の手順をご説明します。

## AWS シナリオ1: カタログレベルのデータ分離

ワークスペースを作成した時点でワークスペース専用のカタログは作成済みです。

![Screenshot 2024-12-11 at 13.14.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0a872d9d-c981-27e9-6022-7c7ad7e5ce7d.png)

カタログで使用するストレージも[外部ロケーション](https://docs.databricks.com/ja/connect/unity-catalog/cloud-storage/manage-external-locations.html)として設定済みです。

![Screenshot 2024-12-11 at 13.21.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ce12c3e6-0314-feac-0ec6-a35c819092d4.png)

新規にカタログを追加します。

![Screenshot 2024-12-11 at 13.19.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b9a4f019-f67a-9048-d6a0-cd9d6cb2d642.png)

:::note info
**注意**
[CREATE CATALOG…MANAGED LOCATION](https://docs.databricks.com/en/sql/language-manual/sql-ref-syntax-ddl-create-catalog.html)でも同様の操作が可能です。
:::

作成済みの外部ロケーションを指定します。

![Screenshot 2024-12-11 at 13.22.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a07cc4d5-ee98-d2ce-fa7f-6738cc2357dd.png)

必要に応じて権限やタグを設定します。

![Screenshot 2024-12-11 at 13.23.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5b9c94d3-74b0-f057-9965-7595057c0cc7.png)
![Screenshot 2024-12-11 at 13.23.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/45f3ee75-f5c1-df1f-c056-50ef911566cf.png)
![Screenshot 2024-12-11 at 13.25.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a7c8828a-2282-b520-83aa-cc89f5163d8b.png)

これで新規カタログが作成されました。

![Screenshot 2024-12-11 at 13.25.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d30cf426-c8d8-f35d-0aca-97a24ef13a59.png)

ワークスペース作成時に構成されたS3バケットに新規カタログのデータも格納されます。

![Screenshot 2024-12-11 at 13.30.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4cec368d-9aa0-1a3e-2c14-861f045351c2.png)

S3バケット自体も分離したい場合は以下の手順を実施してください。

- S3バケットを作成し、当該S3バケットにアクセス可能な[ストレージ資格情報](https://docs.databricks.com/ja/connect/unity-catalog/cloud-storage/storage-credentials.html)を作成します。
- ストレージ資格情報とS3バケットのパスを参照する[外部ロケーション](https://docs.databricks.com/ja/connect/unity-catalog/cloud-storage/external-locations.html)を作成します。
- カタログ作成時に新規に作成した外部ロケーションを選択します。

## AWS シナリオ2: メタストアレベルのストレージ

カタログレベルでのデータ分離が不要の場合には、メタストアレベルのデフォルトストレージを設定することも可能です。詳細は[注意点](#注意点)をご覧ください。

:::note warn
- カタログレベルでのデータ分離は強制できなくなります。
:::

- メタストアレベルのデフォルトストレージとして使用するS3バケットを作成し、当該S3バケットにアクセス可能な[ストレージ資格情報](https://docs.databricks.com/ja/connect/unity-catalog/cloud-storage/storage-credentials.html)を作成します。
- ストレージ資格情報とS3バケットのパスを参照する[外部ロケーション](https://docs.databricks.com/ja/connect/unity-catalog/cloud-storage/external-locations.html)を作成します。
- [Databricksアカウントコンソール](https://accounts.cloud.databricks.com/)にアクセスします。
- UC自動有効化で作成されたメタストアにアクセスします。
![Screenshot 2024-12-11 at 13.32.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4c83dcc2-9e47-4fe2-9ef9-45add6c404fe.png)
- メタストアのストレージを設定するために、上で設定した外部ロケーションのS3バケットパスを**セット**します。これで、メタストアのデフォルトストレージが設定されます。
![Screenshot 2024-12-11 at 13.36.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8005a483-98c1-880f-5370-1710a6fdf84b.png)

## Azure シナリオ1: カタログレベルのデータ分離

ワークスペースを作成した時点でワークスペース専用のカタログは作成済みです。

![Screenshot 2024-12-11 at 14.35.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e07f8a94-7293-9c28-ae29-870b2bbc567a.png)

カタログで使用するストレージも[外部ロケーション](https://learn.microsoft.com/ja-jp/azure/databricks/connect/unity-catalog/cloud-storage/manage-external-locations)として設定済みです。

![Screenshot 2024-12-11 at 14.36.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/87283f96-c7aa-4e6e-2ac3-b7fba477ade2.png)

新規にカタログを追加します。

![Screenshot 2024-12-11 at 14.36.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/910830d3-35bb-e9c2-a64f-55e3d1c2b6a5.png)

:::note info
**注意**
[CREATE CATALOG…MANAGED LOCATION](https://learn.microsoft.com/ja-jp/azure/databricks/sql/language-manual/sql-ref-syntax-ddl-create-catalog)でも同様の操作が可能です。
:::

作成済みの外部ロケーションを指定します。

![Screenshot 2024-12-11 at 14.39.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cabf81a5-7f95-207e-d76a-928f3a432642.png)

必要に応じて権限やタグを設定します。

![Screenshot 2024-12-11 at 14.46.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/17a25e21-3989-14b5-d511-74596c89875e.png)

ADLSコンテナ自体も分離したい場合には以下の手順を実施してください。

- [ストレージアカウント](https://learn.microsoft.com/ja-jp/azure/storage/blobs/create-data-lake-storage-account)とストレージコンテナを作成し、パス(例: `abfss://my-container-name@my-storage-account.dfs.core.windows.net/`)をメモしておきます。
- ストレージアカウントにアクセスできるマネージドIDを保持する[Azure Databricksアクセスコネクタを作成](https://learn.microsoft.com/ja-jp/azure/databricks/data-governance/unity-catalog/azure-managed-identities#config-managed-id)します。(手順4までを実施)
- [ストレージ資格情報を作成](https://learn.microsoft.com/ja-jp/azure/databricks/connect/unity-catalog/cloud-storage/storage-credentials#create-a-storage-credential-using-a-managed-identity)します。(10番までを実施)
- [外部ロケーション](https://learn.microsoft.com/ja-jp/azure/databricks/connect/unity-catalog/cloud-storage/external-locations)を作成します。
- カタログ作成時に、上で作成した外部ロケーションを選択します。

## Azure シナリオ2: メタストアレベルのストレージ

カタログレベルでのデータ分離が不要の場合には、メタストアレベルのデフォルトストレージを設定することも可能です。詳細は[注意点](#注意点)をご覧ください。

:::note warn
- カタログレベルでのデータ分離は強制できなくなります。
:::

- メタストアのデフォルトストレージと指定使用する[ストレージアカウント](https://learn.microsoft.com/ja-jp/azure/storage/blobs/create-data-lake-storage-account)とストレージコンテナを作成し、パス(例: `abfss://my-container-name@my-storage-account.dfs.core.windows.net/`)をメモしておきます。
- ストレージアカウントにアクセスできるマネージドIDを保持する[Azure Databricksアクセスコネクタを作成](https://learn.microsoft.com/ja-jp/azure/databricks/data-governance/unity-catalog/azure-managed-identities#config-managed-id)します。(手順4までを実施)
- [ストレージ資格情報を作成](https://learn.microsoft.com/ja-jp/azure/databricks/connect/unity-catalog/cloud-storage/storage-credentials#create-a-storage-credential-using-a-managed-identity)します。(10番までを実施)
- [外部ロケーション](https://learn.microsoft.com/ja-jp/azure/databricks/connect/unity-catalog/cloud-storage/external-locations)を作成します。
- [Azure Databricksアカウントコンソール](https://accounts.azuredatabricks.net/)にアクセスします。
- UC自動有効化で作成されたメタストアにアクセスします。
![Screenshot 2024-12-11 at 15.14.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/84703019-717c-d3f9-16a4-63bb7379004e.png)
- メタストアのストレージを設定するために、上で設定した外部ロケーションのADLS Gen2バケットパスを**セット**します。これで、メタストアのデフォルトストレージが設定されます。
![Screenshot 2024-12-11 at 15.14.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6067b726-6c9c-1f3a-1655-2227ff09786c.png)

# 参考資料

**AWS**

- [Unity Catalog の設定と管理 \| Databricks on AWS](https://docs.databricks.com/ja/data-governance/unity-catalog/get-started.html)
- [Unity Catalogのベストプラクティス｜Databricks on AWS](https://docs.databricks.com/ja/data-governance/unity-catalog/best-practices.html)
- [Unity Catalog でマネージドストレージロケーションを指定する \|Databricks on AWS](https://docs.databricks.com/ja/connect/unity-catalog/cloud-storage/managed-storage.html)
- [Unity Catalog を使用してクラウド ストレージへのアクセスを管理する \|Databricks on AWS](https://docs.databricks.com/ja/connect/unity-catalog/cloud-storage/index.html)

**Azure**

- [Unity Catalog の設定と管理 \- Azure Databricks \| Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/databricks/data-governance/unity-catalog/get-started)
- [Unity Catalog のベスト プラクティス \- Azure Databricks \| Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/databricks/data-governance/unity-catalog/best-practices)
- [Unity Catalog のマネージド ストレージの場所を指定する \- Azure Databricks \| Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/databricks/connect/unity-catalog/cloud-storage/managed-storage)
- [Unity カタログを使用してクラウド ストレージへのアクセスを管理する \- Azure Databricks \| Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/databricks/connect/unity-catalog/cloud-storage/)


### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)