Unity Catalogのマネージドストレージとは何か

DatabricksのカタログソリューションであるUnity Catalogでは、背後のストレージにアクセスするために用いる外部ロケーション(External location)とストレージ資格情報(Storage credential)というオブジェクトが存在します。

https://docs.databricks.com/ja/connect/unity-catalog/cloud-storage/index.html

すごくざっくり言うと、**ストレージ資格情報**ではS3やADLSにアクセスするのに必要なIAMロールやマネージドIDをカプセル化し、**外部ロケーション**ではS3やADLSのパスとストレージ資格情報をカプセル化します。これらのオブジェクトに対するアクセス制御を行うことで、どのユーザーがどのストレージのどのパスにアクセスできるのかをコントロールすることができます。

![Screenshot 2024-12-05 at 20.35.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0faf8619-9d84-edac-fa20-7ccbf56b3648.png)

そして、最近になって **マネージドストレージ(managed storage)** の存在に気づきました(遅い)。マネージドストレージロケーションといった記述もあって、外部ロケーションとの関係は？となっていました。

おそらく最初にマニュアルで出現するのはこちらかと。

**マネージドストレージを使用したデータの分離**

https://docs.databricks.com/ja/data-governance/unity-catalog/index.html#data-isolation-using-managed-storage

:::note info
**注意**
マニュアルでは「管理されたストレージ」といった表記もありますが、マネージドストレージに修正中です。
:::

以前、以下のようなUC有効化の記事を書きましたが、マネージドストレージに関する検討事項が非常に重要であることに気づきました。このままで(自分的に)まずいので、まずは理解を深めてみます。

# マネージドストレージとは？

**Unity Catalogによって管理される(managed by Unity Catalog)** ストレージです。AWSならS3、AzureならADLS、GCPならGCSです。設定する際にストレージのパスを指定することになりますので、これがマネージドストレージのロケーション(managed storage location)となります。

マニュアルはこちら。

https://docs.databricks.com/ja/connect/unity-catalog/cloud-storage/managed-storage.html

# 何のために使うの？

**データの分離**のためです。企業においては、特定のデータは特定のバケットやパスに格納しなくてはならないと言う要件が存在する場合があります。かつてのUnity Catalogではメタストアのストレージを使うか、外部ロケーションに外部テーブルとして作成することでしかデータの分離ができませんでした。しかも、[予測最適化](https://docs.databricks.com/ja/optimizations/predictive-optimization.html)のようなマネージドテーブル固有の機能を活用するためにはメタストアのストレージしか選択肢がなかったのです。

マネージドストレージを設定することで、メタストアのストレージとは別のストレージロケーションにマネージドテーブルを格納することができますので、マネージドテーブルの恩恵を享受しながらもデータの分離を実現することができます。

以下の表の赤枠で示しているロケーションが、マネージドストレージロケーションです。

![Screenshot 2024-12-05 at 20.48.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c2744084-22c9-4e4d-e151-61577ab7c595.png)

# どのように設定するの？

メタストア、カタログ、スキーマのマネージドストレージのいずれの場合においても、事前のストレージ資格情報と外部ロケーションの作成が必要です。

## メタストアのマネージドストレージ

![Screenshot 2024-12-05 at 21.00.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/950137fe-8c3a-11d3-cb21-874f02810738.png)

:::note warn
**重要！**
まず注意点として、Databricksでの推奨はこの**メタストアのマネージドストレージを設定しない**と言うことです。メタストアのマネージドストレージを設定すると、いかなるカタログ、スキーマのマネージドテーブルを作成できるようになります。使いやすいと言えばその通りなのですが、逆に上述のデータの分離が行われない(カタログ・スキーマによる論理的分離はされていますが、バケットやパスレベルの分離は行われていません)ことになります。

データの分離と使いやすさのバランスを考慮して、使いやすさを優先するのであれば以下の手順に従ってメタストアのマネージドストレージを設定してください。

なお、メタストアのマネージドストレージを設定した場合でも、カタログ、スキーマのマネージドストレージの設定は可能です。**カタログ、スキーマレベルのマネージドストレージの作成を強制したい場合には、メタストアのマネージドストレージは設定しないでください。**
:::

メタストア作成時に設定するのですが、今ではデフォルトでメタストアが[自動で作成](https://docs.databricks.com/ja/data-governance/unity-catalog/get-started.html#enablement)されます。ですので、作成されたメタストアに設定する形になります。

アカウントコンソールにアクセスし、**カタログ > メタストア**に移動します。以下はAWSの例ですが、S3バケットバスを設定します。このS3バケットの作成手順に関しては[こちら](https://docs.databricks.com/ja/data-governance/unity-catalog/create-metastore.html#step-1-optional-create-an-s3-bucket-for-metastore-level-managed-storage-in-aws)をご覧ください。

![Screenshot 2024-12-05 at 20.58.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6371826a-80c9-b1bd-56c0-141b8e90551b.png)
![Screenshot 2024-12-05 at 20.58.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f6540a72-6e37-c47e-ab53-65355f26349b.png)

手順の詳細は[こちら](https://docs.databricks.com/ja/data-governance/unity-catalog/manage-metastore.html#add-managed-storage-to-an-existing-metastore)です。

## カタログのマネージドストレージ

![Screenshot 2024-12-05 at 21.11.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c8703018-7af7-2231-8922-6fb00a366c73.png)

[こちら](https://docs.databricks.com/ja/connect/unity-catalog/cloud-storage/managed-storage.html#set-a-managed-storage-location-for-a-catalog)にあるように、SQLでマネージドストレージを指定してカタログを作成する場合には以下を実行します。

```sql
CREATE CATALOG <catalog-name>
MANAGED LOCATION 's3://<external-location-bucket-path>/<directory>';
```

カタログエクスプローラからも作成できます。

![Screenshot 2024-12-05 at 21.15.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/12028dcc-e0bf-e611-5dee-a871c755973e.png)


## スキーマ(データベース)のマネージドストレージ

[こちら](https://docs.databricks.com/ja/connect/unity-catalog/cloud-storage/managed-storage.html#set-a-managed-storage-location-for-a-schema)にあるように、SQLでマネージドストレージを指定してカタログを作成する場合には以下を実行します。

```sql
CREATE SCHEMA <catalog>.<schema-name>
MANAGED LOCATION 's3://<external-location-bucket-path>/<directory>';
```

カタログエクスプローラからも作成できます。

![Screenshot 2024-12-05 at 21.15.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f3a8de9f-f27b-f6c2-63b8-8b5db9d881d4.png)

# 設定の確認

[こちらで説明](https://docs.databricks.com/ja/connect/unity-catalog/cloud-storage/managed-storage.html#managed-storage-location-storage-root-and-storage-location)されているように、上述の手順でマネージドストレージロケーションが設定されると、そのロケーションは**ストレージルート**となります。ストレージルート配下にサブディレクトリが作成され、そこにデータが格納されます。これが**ストレージロケーション**となります。

![Screenshot 2024-12-05 at 21.23.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/51345ea7-6450-dd49-2b55-a42ed33d08ac.png)

マネージドストレージを設定して作成したカタログにアクセスし、**詳細**タブを開きます。すると、上述のストレージルートとストレージロケーションが表示されます。

![Screenshot 2024-12-05 at 21.17.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7c2e8fef-5e37-14f6-678c-9d779dcc0629.png)

以下は、Unity Catalogの自動有効化機能によって、自動で作成されるワークスペース固有のカタログの情報です。上のカタログ`test`はこちらのストレージルート配下に作成したものです。

![Screenshot 2024-12-05 at 21.25.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d02a589a-fbdb-ed53-5d69-f3a009f464c2.png)

[Unity Catalogの自動有効化](https://docs.databricks.com/ja/data-governance/unity-catalog/get-started.html#enablement)とマネージドストレージの関係を理解したいと言う目的があったので、まずはマネージドストレージを理解しました。

自動有効化された場合、以下のような構成になります。

- **マネージドストレージなし**のメタストアが作成される。
- ワークスペース固有のカタログ(**マネージドストレージ付き**)が作成される。

このため、新規にカタログを作成しようとすると、以下のいずれかを選択しなくてはなりません。
- 別途外部ロケーションを作成してマネージドストレージを設定してカタログを作成する。
- ワークスペース固有のカタログのマネージドストレージを使ってカタログを作成する。
- メタストアのマネージドストレージを作成してそちらを使う。

これで、自動有効化の調査に進めます。続報お待ちください。

### はじめてのDatabricks

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

### Databricks無料トライアル

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