Unity Catalogのウォークスルー

本書では、Databricksが提供するUnity Catalogの基本的な機能をウォークスルーします。

:::note info
**プレビュー**
Unity Catalogは[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。Unity Catalog向けのアカウントコンソールUIは[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。プレビューに参加するには、Databricks担当者にお問合せください。
:::

:::note info
**注意**
- パブリックプレビューにおけるUnity Catalogの[制限](https://docs.databricks.com/data-governance/unity-catalog/limitations.html)を確認してください。
- アカウントコンソールはメタストアを作成、管理し、メタストアをワークスペースにリンクし、メタストアのデータにアクセスできるユーザー、グループのアカウントレベルを管理することができるweb UIです。Unity Catalogはアカウントコンソールに[特定の情報](https://qiita.com/taka_yayoi/items/065706136dcd2ad9df33#%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB)を格納します。
- Unity Catalogを使用するには、[Premium](https://databricks.com/jp/product/aws-pricing)プランのDatabricksアカウントが必要です。
:::

# Unity Catalogとは

Unity Catalogは、レイクハウスにおけるデータとAIに対するきめ細かいガバナンスを提供するメタストアです。

Unity Catalogは以下のキーとなる機能によって、お使いのデータに対するセキュリティとガバナンスをシンプルなものにします。

- **一度定義すれば、どこでもセキュアに:** Unity Catalogは全てのワークスペース、ペルソナに対して適用されるデータアクセスポリシーを管理する唯一の場所を提供します。
- **標準準拠のセキュリティモデル:** Unity Catalogのセキュリティモデルは標準的なANSI SQLをベースとしており、管理者は馴染みのある文法を用いて、既存データレイクに存在するカタログ、データベース、テーブル、ビューのレベルでアクセス権を設定することができます。
- **ビルトインの監査機能:** Unity Catalogは自動でユーザーレベルの監査ログを捕捉し、データへのアクセスを記録します。

Unity Catalogの概要、キーコンセプトに関しては以下の記事を参照ください。

- [DatabricksのUnity Catalog\(プレビュー\)](https://qiita.com/taka_yayoi/items/15aede468bdca58ec6a3)
- [Unity Catalogを使い始める](https://qiita.com/taka_yayoi/items/3f2df6ddea81521ee786)
- [Unity Catalogのキーコンセプト](https://qiita.com/taka_yayoi/items/065706136dcd2ad9df33)

# Unity Catalogのウォークスルー

以降では、Unity Catalogをどのように利用するのかを説明します。Unity Catalogの設定手順については、Unity Catalogの有効化後に[Unity Catalogを使い始める](https://qiita.com/taka_yayoi/items/3f2df6ddea81521ee786)の手順に従ってください。

## クラスターの作成

Unity Catalogで管理されるデータにアクセスするためには、Databricksクラスターの設定が必要となります。

- Databricksランタイム10.3以降が必要です。
- **Advanced options**配下の**Security Mode**で、**Single User**あるいは**User Isolation**を設定します。

![Screen Shot 2022-03-14 at 16.55.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/aaa31d76-d26f-0580-dc63-7460999e1503.png)

## 新規カタログの作成

上で作成したクラスターにSQLノートブックをアタッチします。本書ではノートブックからの操作を説明しますが、Databricks SQLのData Explorerでもアクセス権の管理などを行うことができます。

これまでは2レベルの名前空間でデータベースとテーブルを管理していましたが、Unity Catalogでは3レベルの名前空間を用いることになります。新たに**カタログ**が最上位に存在することになります。

Unity Catalogではカタログ、スキーマ(データベースとも呼ばれます)、テーブルとビューを提供します。テーブルを参照するには以下の文法を使用します。

>`<catalog>.<schema>.<table>`

ワークスペースのローカルHiveメタストア、あるいは外部Hiveメタストアにすでにデータがある場合、Unity Catalogは**追加**される形となります: 既存のワークスペースのHiveメタストアは3レベル名前空間のカタログの1つ(`hive_metastore`と呼ばれます)になり、Hiveメタストアのテーブルは3レベルの名前空間記述: `hive_metastore.<schema>.<table>`によってアクセスすることができます。

カタログを作成するには、`CREATE CATALOG`文を使用します。カタログを作成できるのはDatabricksアカウントで「メタストア管理者(Metastore admin)」として登録されているユーザーのみです。以下の例では`quickstart_catalog_taka`というカタログを作成しています。

```sql:SQL
--- 新規カタログの作成
CREATE CATALOG IF NOT EXISTS quickstart_catalog_taka;
```

カタログを選択するには`USE CATALOG`文を使用します。

```sql:SQL
-- カタログの選択
USE CATALOG quickstart_catalog_taka;
```

`SHOW CATALOG`を用いることで、メタストアの全てのカタログを表示します。

```sql:SQL
--- メタストアの全てのカタログの表示
SHOW CATALOGS;
```

![Screen Shot 2022-03-18 at 7.49.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b9566246-f67e-6156-790b-7d9e0933f828.png)

カタログのアクセス権を設定します。アクセス権設定の詳細は[アクセス権の管理](#アクセス権の管理)で説明します。

```sql:SQL
--- アカウントの全ユーザーに対してCREATE、USAGE権限を許可
--- これは、他のアカウントレベルのグループ、ユーザーにも動作します
GRANT CREATE, USAGE
ON CATALOG quickstart_catalog_taka
TO `account users`;
```

```sql:SQL
--- カタログのアクセス権の確認
SHOW GRANT ON CATALOG quickstart_catalog_taka;
```

![Screen Shot 2022-03-18 at 7.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5b4e4fee-1e33-3c7a-9d32-7864dbe386b4.png)

## スキーマの作成

スキーマ(データベース)はUnity Catalog名前空間の2番目のレイヤーであり、テーブルとビューを管理します。

```sql:SQL
--- カタログに新規スキーマを作成
CREATE SCHEMA IF NOT EXISTS quickstart_schema
COMMENT "quickstart_schemaという新規Unity Catalogのスキーマです";
```

```sql:SQL
-- 選択されたカタログのスキーマを表示
SHOW SCHEMAS;
```

![Screen Shot 2022-03-18 at 7.52.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/eddb532a-b813-dc1e-f803-a38d7b0945a3.png)

```sql:SQL
-- スキーマの詳細を表示
DESCRIBE SCHEMA EXTENDED quickstart_schema;
```

![Screen Shot 2022-03-18 at 7.52.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c94822d9-6cf1-83aa-954c-89af5be35618.png)

## テーブルの作成

Unity Catalogにおけるテーブルには*マネージドテーブル*と*外部テーブル*があります。Unity Catalogでテーブルを作成する際、デフォルトでは*マネージドテーブル*になります。`LOCATION`が指定されない場合、テーブルはメタストアに設定されたマネージドの格納場所に作成されます。

```sql:SQL
-- スキーマの選択
USE quickstart_schema;
```

```sql:SQL
-- マネージドのDeltaテーブルを作成、2行を追加
CREATE TABLE IF NOT EXISTS quickstart_table
  (columnA Int, columnB String) PARTITIONED BY (columnA);

INSERT INTO TABLE quickstart_table
VALUES
  (1, "one"),
  (2, "two");
```

```sql:SQL
-- スキーマの全テーブルの表示
SHOW TABLES IN quickstart_schema;
```

![Screen Shot 2022-03-18 at 7.54.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b4068c57-eb21-991b-79c4-2a6cc29a2469.png)

```sql:SQL
-- テーブルの詳細を表示
DESCRIBE TABLE EXTENDED quickstart_table;
```

![Screen Shot 2022-03-18 at 7.55.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/795380ec-6b83-a5da-fe27-cd4f8bd5db00.png)

3レベルの名前空間を用いることで、いくつかの方法でテーブルにアクセスすることができます。

- 完全修飾名によるアクセス
- デフォルトカタログを選択し、スキーマ、テーブル名を用いてテーブルにアクセス
- デフォルトスキーマを選択し、テーブル名を使用

以下の3つのコマンドは機能的に等価です。

```sql:SQL
-- 3レベル名前空間を用いたテーブルへのクエリーの実行
SELECT
  *
FROM
  quickstart_catalog_taka.quickstart_schema.quickstart_table;
```

```sql:SQL
-- デフォルトカタログを選択し、スキーマ、テーブル名でテーブルへクエリーを実行
USE CATALOG quickstart_catalog_taka;
SELECT *
FROM quickstart_schema.quickstart_table;
```

```sql:SQL
-- デフォルトカタログとデフォルトスキーマを選択し、テーブル名でテーブルへクエリーを実行
USE CATALOG quickstart_catalog_taka;
USE quickstart_schema;
SELECT *
FROM quickstart_table;
```

これらは全て同じ結果を返します。
![Screen Shot 2022-03-18 at 7.56.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/54611330-c48c-13db-268a-620f6c7ade4c.png)

### テーブルの削除

`DROP TABLE`コマンドで*マネージドテーブル*を削除すると、実体であるデータファイルも削除されます。

`DROP TABLE`コマンドで*外部テーブル*を削除すると、テーブルに関するメタデータはカタログから削除されますが、実体のデータファイルは削除されません。

```sql:SQL
-- マネージドテーブルの削除(以降のコマンドを実行するには、テーブルを再作成してください)
DROP TABLE quickstart_catalog_taka.quickstart_schema.quickstart_table
```

## リネージュの追跡

Unity Catalogで管理されるテーブルはリネージュ(系統情報)が追跡されます。どのテーブルからどのテーブルが作成されたのか、カラムレベルで追跡が可能です。

:::note info
**注意**
- リネージュ機能を利用するには別途プライベートプレビューの申し込みが必要です。
- クラスター、SQLエンドポイントで追加の設定`spark.databricks.dataLineage.enabled true`が必要です。
- 2022/3/15時点では以下のリージョンのみでサポートされています。今後追加予定です。
  - AWS: us-west-1, us-west-2, us-east-1, us-east-2
  - Azure: EAST US, EAST US 2, WEST US
:::

```sql:SQL
-- スキーマを作成し、権限を付与します
CREATE SCHEMA quickstart_catalog_taka.lineagedemo;
GRANT USAGE, CREATE on SCHEMA quickstart_catalog_taka.lineagedemo to `account users`;
```

```sql:SQL
-- ソーステーブルを作成します
CREATE TABLE IF NOT EXISTS quickstart_catalog_taka.lineagedemo.menu (
  recipe_id INT,
  app string,
  main string,
  desert string
);

INSERT INTO quickstart_catalog_taka.lineagedemo.menu 
    (recipe_id, app, main, desert) 
VALUES 
    (1,"Ceviche", "Tacos", "Flan"),
    (2,"Tomato Soup", "Souffle", "Creme Brulee"),
    (3,"Chips","Grilled Cheese","Cheescake");
```

```sql:SQL
-- ソーステーブルから派生テーブルを作成します
CREATE TABLE quickstart_catalog_taka.lineagedemo.dinner 
AS SELECT recipe_id, concat(app," + ", main," + ",desert) as full_menu FROM quickstart_catalog_taka.lineagedemo.menu
```

Databricks SQLのData Explorerでリネージュを確認します。

派生テーブルである`dinner`の**Lineage**を確認すると、**Upstream**にソーステーブルである`menu`が表示されています。
![Screen Shot 2022-03-18 at 8.00.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4c475422-801f-5902-bedb-0b56bbffceef.png)

**See Lineage Graph**をクリックすることで、グラフ構造を可視化することができます。
![Screen Shot 2022-03-18 at 8.02.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4c9d38c1-24df-d586-e0b9-7c627a39f6ed.png)

さらに行レベルのリネージュを確認します。派生テーブルの`dinner`のカラム`full_menu`は、ソーステーブルの3つのカラムを結合したものでした。**Schema**をクリックし、`full_menu`を選択します。すると、**Upstream**にはソーステーブルの3つのカラムが表示されています。
![Screen Shot 2022-03-18 at 8.04.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9afe2357-95ec-a9f8-d1af-91a4b53af537.png)

ここでも、**See Lineage Graph**をクリックすることで、カラムレベルのリネージュグラフを確認することができます。
![Screen Shot 2022-03-18 at 8.05.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/13f4471f-d9de-9fc7-0c3b-32900948dc14.png)

このように、複数のテーブルを活用しているシーンにおいても、あるテーブルがどのテーブルから作成されたのか、あるカラムはどのように作成されたのかをきちんと追跡できるようになります。これによって、データサイエンティストやデータアナリストは安心してデータを活用できるようになります。

## アクセス権の管理

データへのアクセスを管理するために、`GRANT`と`REVOKE`文を使用します。Unity Catalogはデフォルトでセキュリティ保護を行い、データへのアクセスは自動では許可されません。最初は、全てのユーザーがデータにアクセスすることができません。メタストアの管理者とデータのオーナーが、アカウントレベルのユーザーとグループに対してアクセス権の許可、剥奪を行うことができます。GRANTは再帰的ではありません。明示的に、カタログ、スキーマ、テーブル・ビューに対してアクセス権を許可する必要があります。

Unity Catalogにおけるアクセス権の詳細については、[Unity Catalogにおけるデータのアクセス権](https://qiita.com/taka_yayoi/items/57589857e22569c56300)をご覧ください。

### アクセス権の許可

セキュリティ保護可能オブジェクトにプリンシパルのアクセス権を許可します。メタストア管理者とセキュリティ保護可能オブジェクトのオーナーのみがアクセス権を許可することができます。

```sql:SQL
-- スキーマの USAGE を許可
GRANT USAGE
ON SCHEMA quickstart_schema
TO `account users`;
```

```sql:SQL
-- プリンシパルに対してテーブルの　SELECT を許可
GRANT SELECT
ON TABLE quickstart_schema.quickstart_table
TO `account users`;
```

### アクセス権の表示

```sql:SQL
-- quickstart_tableのアクセス権の表示
SHOW GRANTS
ON TABLE quickstart_catalog_taka.quickstart_schema.quickstart_table;
```

![Screen Shot 2022-03-18 at 8.09.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1b0c2310-7e41-7ef8-4109-a2d38f4fa196.png)

```sql:SQL
-- quickstart_schemaのアクセス権の表示
SHOW GRANTS
ON SCHEMA quickstart_catalog_taka.quickstart_schema;
```

![Screen Shot 2022-03-18 at 8.10.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1680accc-6d73-8678-5313-bdf293a23a8a.png)

### アクセス権の剥奪

```sql:SQL
REVOKE SELECT
ON TABLE quickstart_schema.quickstart_table
FROM `account users`;
```

なお、これらアクセス権の管理は、Databricks SQLのData Explorerからも操作することができます。
![Screen Shot 2022-03-18 at 8.12.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4f5af218-0740-dd37-7fb1-361a7b48ed0d.png)

今回ご紹介した機能はプレビュー段階のものです。GAに向けて機能改善を行なっていく予定ですので楽しみにしていてください。

### Databricks 無料トライアル

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