Databricks Unity Catalog の基本と活用方法

みなさん、こんにちは！
Databricks におけるデータ管理の中心的役割を担う Unity Catalog ですが、その機能の幅広さゆえ、具体的にどのようなものかイメージが掴みにくいものでもあります。

本記事ではそんな Unity Catalog について、機能にフォーカスして具体的な例とともに解説していきます。

※本記事では Azure Databricks を使用しています。

## Unity Catalog とは？
Unity Catalog は Databricks 上のデータを一元管理するためのソリューションであり、大きく以下の3つの機能を提供します：

* Hiveメタストア機能
* アクセスコントロール機能
* データカタログ機能

それぞれの機能について、以降で詳しく見ていきます。

## Hiveメタストア機能
Unity Catalog はHiveメタストアとしての機能を持っています。

Hiveメタストアは、テーブル定義などのメタデータを保存する機能です。
Apache Hive の仕組みに基づき、オブジェクトストレージ上のデータに対してSQLでデータ処理を行うことが可能です。

例えば以下のSQLを実行すると、DBFS の `tables/comments` 配下に格納したJSONファイルを読み込み、commentsテーブルとしてDelta形式で格納することができます。
```ruby:qiita.rb
CREATE TABLE main.default.comments
USING DELTA
AS SELECT * from json.`dbfs:/FileStore/tables/comments/`;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/6d382bae-a134-430b-9e80-f62c3f380e3d.png)

## アクセスコントロール機能
Databricks では、データベースオブジェクト（カタログ、スキーマ、テーブル）とストレージオブジェクト（ストレージに格納されたファイルなど）の両方に対し、SQLベースの権限管理を行うことができます。

**テーブルなどの論理データだけでなく、その実体となるファイルなどの物理データへのアクセスも同じように一元管理できる**という点が大きな特徴です。

### データベースオブジェクト
カタログ、スキーマ、テーブルそれぞれのレベルで権限管理を行うことができます。
SQLとWeb UIの両方で設定や確認を行うことが可能です。

※カタログレベルで設定された権限はスキーマ、テーブルにも継承されます。

例としてテスト用アカウント「Test User」を作成し、「Test Group」に追加しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/ad75dcb1-26af-43b0-8490-237cb32edf9e.png)
Test User としてログインし、commentsテーブルに対してSELECT文を実行すると、権限がないというエラーが出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/32bec574-fb08-4aeb-861f-9d0f1df7bce0.png)
今度は Test Group にcommentsテーブルのSELECT権限を付与します。
```ruby:qiita.rb
GRANT SELECT ON TABLE main.default.comments TO `Test Group`;
```

この状態で再度SELECT文を実行すると、エラーなく表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/6f64a21a-031b-4dca-a251-f73d4aca21b5.png)

「権限」タブでテーブルの権限詳細を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/93617993-9433-40db-ac6e-c1820b34677e.png)

### ストレージオブジェクト
特定のストレージオブジェクトに対する `READ FILES`、`WRITE FILES` などの権限を管理することができます。

例として、権限のないユーザ（Test User）で直接ストレージオブジェクトの読み取りをしようとすると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/7846c0aa-d71d-4d91-b216-bb44c493b099.png)

`READ FILES`権限がなくエラーになっているので、Test User に`READ FILES`権限を追加していきます。

まず、Databricks の Webターミナルから以下を実行し、ストレージクレデンシャル（ストレージアクセス用の認証情報）を作成します。
```ruby:qiita.rb
databricks storage-credentials create --json '{"name": "my_azure_storage_cred", "azure_service_principal": {"directory_id": "<ディレクトリID>", "application_id": "<アプリケーションID>", "client_secret": "<クライアントシークレット>"}}'
```

※上記で指定したサービスプリンシパルには対象ストレージに対する「ストレージ BLOB データ共同作成者」ロールを割り当てておく必要があります。サービスプリンシパルの設定については[こちら](https://www.reqtc.com/blog/azure-databricks-api.html)の内容をご参照ください。

以下のようなSQLコマンドで、アクセス可能な外部ロケーションを定義します。
```ruby:qiita.rb
CREATE EXTERNAL LOCATION sample_loc URL 'abfss://<コンテナ>@<ストレージアカウント>.dfs.core.windows.net/samples'
WITH (STORAGE CREDENTIAL my_azure_storage_cred)
```

Test Group に上記で定義した外部ロケーションに対するアクセスを許可します。

```ruby:qiita.rb
GRANT READ FILES ON EXTERNAL LOCATION sample_loc TO `Test Group`;
```

上記SQL実行後、ファイルから直接データを読み取れることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/727a29bb-e0d9-4ee4-aec9-7ae5b07bfcd0.png)

## データカタログ機能
Unity Catalog はデータカタログとしての機能も持っています。

### メタデータ管理
カタログ、スキーマ、テーブルに対してメタデータ（説明、タグなど）を付与し、管理することができます。

検索の際、付与したコメントやタグに基づいてデータが表示されるため、必要なデータにすぐにアクセスすることが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/8929c6a1-aee1-4ed9-bda4-711cae3b364e.png)

### データリネージ
テーブルやデータの来歴、依存関係などを追跡することができます。

メニューの「カタログ」からテーブル詳細を開き、「依存関係」タブでテーブルの依存関係（元テーブルや派生しているビューなど）を確認可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/bb58d65f-2396-48ac-b669-039d20c0f3e5.png)

「リネージグラフを表示」でリネージを以下のような形で確認することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/35842c0d-f7bb-442d-b694-6ba92fb8610e.png)

## 補足：従来のHiveメタストアとの違い
Databricks には、Unity Catalog の他に「レガシー」と表示されている hive_metastore があります。これもHiveメタストアの名前を冠していますが、何が違うのでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/458cbe21-7aaf-4056-b33c-8a9d3caf9541.png)

hive_metastore も Unity Catalog と同じHiveメタストアですが、主に以下の違いがあります。

* データの格納場所
* サポートされている機能

Unity Catalog はユーザが手動で作成または Databricks により自動作成された Unity Catalog 専用のストレージが使用されますが、hive_metastore の場合は Databricks により管理される DBFS というストレージが使用されます。

また、Unity Catalog に比べてレガシー扱いの hive_metastore はサポートされている機能が少ないです。例えばテーブルの依存関係、洞察、品質といった機能が利用できないほか、機械学習モデルの登録にも対応していません。

特にこだわりがない場合は hive_metastore でも問題ないと思いますが、Unity Catalog の利用が公式に推奨されているため、迷った場合は Unity Catalog を選択しておくのが良いと思います。

なお、Unity Catalog は **Premium** 以上のプランでしか利用できないためご注意ください。

## さいごに
Unity Catalog の基本と活用方法について、具体的な例とともに見てきました。

最初は理解するのが難しい Unity Catalog ですが、本記事を通して少しでも具体的なイメージを掴んでいただけたら幸いです。Unity Catalog を活用し、安全かつ効率的なデータ管理を実現していきましょう。

## 参考
* [機能から理解するDatabricks「Unity Catalog」 #AWS - Qiita](https://qiita.com/nttd-saitouyun/items/57c2ac16d874539a1209)
* [Credentials - Azure Databricks - Databricks SQL](https://learn.microsoft.com/en-us/azure/databricks/sql/language-manual/sql-ref-storage-credentials)