Delta Sharingを使ってAzure Databricks と AWS Databricks 間でデータ共有を行なってみる


# はじめに

Delta Sharingを利用すると**Databricks to Databricks**もしくは [**Databricks to Open\(DeltaSharing Client)間**](https://qiita.com/maroon-db/items/d7a1de2a274da1c0ac23)でデータ共有が行えるようになります。共有といってもReadOnlyなので一方通行ですが、他のデータブリックス環境で作成されたデータを、どのデータブリックス環境（もちろん許可された）からアクセス出来るようになったら、データ活用の幅が広がる気がします。

今回は以下のように、Azure Databricks上のUnityCatalogテーブルを、AWS Databricksから参照できるように設定したいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/366d42c4-2049-32da-8b57-6337100e2644.png)

# 準備

以下のセットアップが完了している必要があります。
- Unity Catalogが利用できる
- [DeltaSharingが有効になっている](https://docs.databricks.com/data-sharing/set-up.html)
- 共有するメタストアに対して管理権限を持っているもしくはメタストアに対して特権（CREATE_SHARE, CREATE_RECIPIENT, CREATE_PROVIDER)を持っている

詳細なDeltaSharing要件については[マニュアル](https://docs.databricks.com/data-sharing/set-up.html)もご覧ください。

# 1. Delta Sharing 受信者の登録

まずはData Provider側（今回はAzure側）に、受信者情報を登録します。

登録するためには、受信側(今回はAWS側）の**共有識別子**が必要になります。

### 1-1. 受信側ワークスペースから、共有識別子を取得

受信側のワークスペースのデータエクスプローラ画面から、「Delta Sharing」-「自分と共有」を選択し、共有識別子をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/9295176b-bfa1-073a-90d2-a8c884cf24ec.png)

### 1-2. 共有側ワークスペースで受信者情報を作成する

共有する側のワークスペースのデータエクスプローラから、「Delta Sharing」-「自分が共有」を選択し、右上の「新たな受信者」をクリックして作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/93cfc638-89d9-cd72-6dc1-2e24baa10bdc.png)


# 2. 共有オブジェクトの作成

### 2-1. 共有するテーブルを指定し共有オブジェクトを作成します。

同じくデータエクスプローラ（共有する側）のDelta Sharingメニューから、「自分が共有」を選択し、右上にある「データを共有」をクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/b0d46706-202c-1d41-d25a-cedcb467ce07.png' width='700'>

### 2-2. オブジェクトが作成できたら、次に共有するテーブルを追加してきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/f346e1ee-357f-6b54-d338-2679016013a8.png)

高度なテーブルオプションでは、エイリアス名をつけたり、共有するパーティションを指定したり、CDFとして共有するなど選択できます。

最後に保存する。

### 2-3. 作成した共有オブジェクトに受信者を追加

共有オブジェクト画面にて、右上に「受信者を追加」ボタンをクリックし、1で作成した受信者を追加します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/7e0bcd97-ce04-160c-496b-ceb583e3fc24.png" width='800'>

# 3. 受信側で共有カタログの作成

### 3-1. すでに共有が始まっているので、受信側のワークスペース（今回はAWS)にて確認してみます。

まずは、プロバイダーを選択します。これは共有側のDeltaShareを有効にした際に作成した名前もしくはUUIDになります。あらかじめ共有側に名前を確認しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/fbab990e-0055-4bdf-9d7c-2fc9a42b48ae.png)

### 3-2. カタログ作成し登録

共有されているテーブルは、受信側でカタログ作成することで利用出来るようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/2950b2ed-e708-36e9-5ad7-68d3dc2b34d7.png)

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/d9be4180-0e7d-755c-69a6-a66a5d1b74b8.png' width='600'>

# 4. 利用してみよう

これで通常のデータと同様にアクセス出来るようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/453a6e1c-a295-dac1-3753-d847123c3bc6.png)

権限としてはSELECT権限のみです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/8afbfc65-fbd8-3d47-685b-c5c086de90f3.png)

詳細情報をみてみると、ストレージロケーションにdeltasharingパスが利用されております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/5767c560-de65-3cdf-451f-808749c74e6c.png)

もちろんクエリーも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/dc8bff80-e906-b091-30a2-e9b87b4722e8.png)


# その他

- Databricks間の共有の場合、トークンを利用しないため有効期限はありません。
- DeltaSharingの場合、直接ストレージのテーブルデータにアクセス出来るため、データ提供側のクラスターやSQLウェアハウスは起動不要です。
- データはレプリケーションされるわけではなく、直接データ提供側のデータに毎回アクセスしにいきます。
- 異なるクラウドプロバイダーやリージョン間ではネットワーク通信費用が発生します。

詳細はマニュアルをご覧ください。
https://docs.databricks.com/data-sharing/index.html