はじめに
外部の場所とストレージの資格情報を使用すると、ユーザーに代わって Unity Catalog でクラウド テナントのデータの読み取りと書き込みを行うことができます。今回はAzure環境での実践編です。AWS編はこちらをご覧ください。
またUnityCatalog自体の設定などはこちらをご覧ください。
https://qiita.com/maroon-db/items/57cee03cef202c839b94
外部ロケーションについてもっと詳しく知りたい方は、こちらのマニュアルをご覧ください。
要件
- ストレージの資格情報を作成するには、Azure Databricks のアカウント管理者である必要があります。ストレージの資格情報を作成するアカウント管理者は、この資格情報に対するアクセス許可を管理するように、所有権を別のユーザーまたはグループに委任できます。
- 外部の場所を作成するには、メタストア管理者か、CREATE EXTERNAL LOCATION 特権を持つユーザーである必要があります。
- Unity カタログでは、外部の場所の Azure Data Lake Storage Gen2 のみがサポートされます。
Azure側の設定
外部ロケーションと資格情報の登録のため、Azure側でまずはADLSストレージアカウントとコンテナ、そしてそれにアクセスするためにAzureマネージドIDの作成を行います。資格情報はAzureマネージドID以外にもサービスプリンシパルもサポートしてますが、AzureマネージドIDを強く推奨しております。その理由はこちらです。
- ストレージ ファイアウォールによって保護されている Azure Data Lake Storage Gen2 アカウントに接続できます。
- マネージド ID では、資格情報を維持したり、シークレットをローテーションしたりする必要がありません。
1. ADLS gen2ストレージアカウントの作成
今回は、以下の通り新規ストレージアカウントを作成しました。
- ストレージアカウント名: ucexternal2
- 地域: Japan East
- パフォーマンス: Standard
- 冗長性: GRS
- ADLS gen2(階層型名前空間): 有効
次のページに進み階層型名前空間を有効にするにチェックを入れます。
残りはデフォルト値のままで作成。
2. 新規ストレージコンテナを作成します。
次に作成したストレージアカウント上にコンテナを作成します。
- コンテナ名: ex-container
最後にコンテナーの ADLSv2 URI を書き留めます。これは次の形式です。
abfss://<container-name>@<storage-account-name>.dfs.core.windows.net
今回のケースだとこちらになります。
abfss://ex-container@ucexternal2.dfs.core.windows.net
3. マネージドIDを作成してストレージにアクセスできるようにする
次に作成したストレージコンテナにアクセス出来るようにするため、マネージドIDコネクタを作成して登録します。
参考マニュアルはこちらです。
ステップ1. Azure Databricks アクセス コネクタを作成する
Azure Databricks アクセス コネクタはファースト パーティーの Azure リソースであり、マネージド ID を Azure Databricks アカウントに接続できます。 Azure Databricks アカウント管理者は、アクセス コネクタに割り当てられたマネージド ID を、Unity Catalog メタストアなどの Azure Databricks リソースに委任できます。
1). リソース グループの共同作成者または所有者として Azure portal にログインします。
新規でリソースグループを作成して、ストレージアカウントと別のリソースグループを用意することも可能です。ただしリソース グループは、接続先のストレージ アカウントと同じリージョンに存在する必要があります。
今回はストレージアカウント(ucexternal2)と同じリソースグループであるexternal-rg
を利用します。
2). [+ 作成] または [新しいリソースを作成] をクリックします。
3). [テンプレートのデプロイ]で検索し、作成をクリックします。
4). [エディターで独自のテンプレートをビルド] をクリックします。
5). このテンプレートをコピーして貼り付けます。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"connectorName": {
"defaultValue": "testConnector",
"type": "String",
"metadata": {
"description": "The name of the Azure Databricks Access Connector to create."
}
},
"accessConnectorRegion": {
"defaultValue": "[resourceGroup().location]",
"type": "String",
"metadata": {
"description": "Location for the access connector resource."
}
},
"enableSystemAssignedIdentity": {
"defaultValue": true,
"type": "bool",
"metadata": {
"description": "Whether the system assigned managed identity is enabled"
}
}
},
"resources": [
{
"type": "Microsoft.Databricks/accessConnectors",
"apiVersion": "2022-04-01-preview",
"name": "[parameters('connectorName')]",
"location": "[parameters('accessConnectorRegion')]",
"identity": {
"type": "[if(parameters('enableSystemAssignedIdentity'), 'SystemAssigned', 'None')]"
}
}
]
}
6). [基本] タブで、以下のフィールドの値をそのまま使用するか、選択または入力します。
- [サブスクリプション]: これは、Azure Databricks アクセス コネクタが作成される Azure サブスクリプションです。 既定値は、現在使用している Azure サブスクリプションです。 テナント内の任意のサブスクリプションにすることができます。
- [リソース グループ]: これは、接続先のストレージ アカウントと同じリージョン内のリソース グループである必要があります。
- [リージョン]: これは、接続先のストレージ アカウントと同じリージョンである必要があります。
- [コネクタ名]: コネクタ リソースの目的を示す名前を入力します。
- [コネクタ リージョンへのアクセス]: コネクタ リソースをリソース グループと同じリージョンにデプロイするには、既定値 [resourceGroup().location] をそのまま使用します。 別のリージョンの値も入力できますが、Databricks では、コネクタ リージョンとリソース グループ リージョンは、接続先のストレージ アカウントと同じにすることをお勧めします。
- [システム割り当て ID を有効にする]: 既定値 true をそのまま使用します。
7). [次へ: 確認と作成]> をクリックします。
8). Create をクリックしてください。
デプロイが成功すると、Azure Databricks アクセス コネクタがシステム割り当てのマネージド ID でデプロイされます。
9). デプロイが完了したら、 [リソースに移動] をクリックします。
10). リソース ID を記録しておきます。
リソース ID の形式は次のとおりです。
/subscriptions/12f34567-8ace-9c10-111c-aea8eba12345c/resourceGroups/<resource_group>/providers/Microsoft.Databricks/accessConnectors/<connector-name>
ステップ2. マネージド ID にストレージ アカウントへのアクセスを許可する
-
作成したストレージアカウントの画面に移動します。(ucexternal2)
-
左メニューの[アクセス制御 (IAM)] に移動して、[+ 追加] をクリックし、[ロールの割り当ての追加] を選択します。
-
[ストレージ BLOB データ共同作成者] ロールを選択し、[次へ] をクリックします。
-
[アクセスの割り当て先] で [マネージド ID] を選択します。
-
コネクタ名を検索して選択し、[確認と割り当て] をクリックします。
Databricks側の設定
それでは準備が整いましたので、Databricks側の設定に移りたいと思います。
Azure側で作成したコンテナへのURIとAzureマネージドIDコネクタの情報をメモしておきます。
作成したコンテナーの ADLSv2 URI を書き留めます。これは次の形式です。
abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/<metastore-name>
作成したアクセス コネクタのリソース IDをメモしておきます。形式は以下の通りです。
/subscriptions/12f34567-8ace-9c10-111c-aea8eba12345c/resourceGroups/<resource_group>/providers/Microsoft.D atabricks/accessConnectors/<connector-name>
Step1. ストレージ資格情報を作成する
ワークスペースにログインし、「データ」メニューを開き、「ストレージ資格情報」から「資格情報を作成」にて、資格情報を作成します。
資格情報名と、先ほどメモしたAzureリソースIDを入力します。
Step2. 外部の格納場所(外部ロケーション)を作成する
次に外部ロケーションを登録します。
同じく「データ」メニューを開き、「外部の格納場所」から「格納場所を作成」をクリックします。
外部の格納場所名と、ストレージのURLとアクセスするための資格情報を選択します。
URLには、/path
とサブディレクトリーも指定可能です。
さいごに
以上でストレージの外部ロケーションと資格情報の登録が完了しました。
あとは、外部テーブルとしてこちらのパスを指定したり、カタログやスキーマレベルでストレージ先を変更するなどが可能になります。