Azure データレイク ストレージと Blob Storage に接続する
この記事では、Unity Catalogのガバナンスをバイパスする、Azure以外のDatabricksワークスペースからAzure Data Lake Storage (ADLS) とBlob Storageにアクセスするためのレガシパターンについて説明します。このストレージアカウントのデータに Unity Catalog ガバナンスが不要な場合に限り、使用してください。
この記事では、Azure Databricksから データレイクStorageおよびBlob Storageに接続する方法について説明します。
従来の Windows Azure ストレージ BLOB ドライバー (WASB) は非推奨になりました。 ABFSには、WASBに比べて多くの利点があります。 ABFS に関する Azure のドキュメントを参照してください。レガシ WASB ドライバーの操作に関するドキュメントについては、「 WASB を使用して Azure Blob Storage に接続する (レガシ)」を参照してください。
ステップ1: Microsoft Entra ID アプリケーションを登録する
Microsoft Entra ID を持つアプリケーションはAzure Storage アカウントへのアクセスを提供するために使用できるサービスプリンシパルを作成します。
Microsoft Entra ID アプリケーションを登録するには、Microsoft Entra ID の Application Administrator ロールまたは Application.ReadWrite.All 権限が必要です。
- Azure portal で、**Microsoft Entra ID** サービスに移動します。
- [管理] で、 アプリの登録 をクリックします。
- 「 + 新規登録 」をクリックします。アプリケーションの名前を入力し、 登録 をクリックします。
- 証明書とシークレット をクリックします。
- 「 + 新しいクライアントのシークレット 」をクリックします。
- シークレットの説明を追加し、**追加**をクリックします。
- 新しいシークレットの値をコピーし、保存します。
- アプリケーション登録の概要で、 アプリケーション (クライアント) ID と ディレクトリ (テナント) ID をコピーして保存します。
ステップ 2:サービスプリンシパルにロールを割り当てる
ストレージアカウントに関連付けられた Microsoft Entra ID アプリケーション登録にロールを割り当てることで、ストレージリソースへのアクセスを制御します。特定の要件に応じて、他のロールを割り当てる必要がある場合があります。
ストレージアカウントにロールを割り当てるには、所有者またはユーザーアクセス管理者 Azure RBAC ロールである必要があります。
- Azure ポータルで、 ストレージ アカウント サービスに移動します。
- このアプリケーション登録で利用する Azure ストレージ アカウントを選択してください。
- アクセス制御(IAM) をクリックします。
- + 追加 をクリックし、ドロップダウン メニューから ロールの割り当てを追加 を選択します。
- 選択 フィールドを Microsoft Entra ID アプリケーション名に設定し、 ロール を ストレージ BLOB データ共同作成者 に設定します。
- 保存 をクリックします。
ステップ3:DatabricksでAzure資格情報を構成する
アクセスするAzureストレージアカウントの資格情報を使用して、Databricksクラスターまたはノートブックを構成します。
対応している資格情報タイプとシークレットストレージ
次の資格情報を使用して、 Azure データレイク ストレージまたは Blob Storage にアクセスできます。
-
Microsoft Entra ID サービスプリンシパルによる OAuth 2.0 :Databricksでは、Azure Data Lake Storageへの接続にMicrosoft Entra ID サービスプリンシパルを使用することを推奨しています。Microsoft Entra ID サービスプリンシパルを作成し、Azureストレージアカウントへのアクセスを提供するには、上記のステップ1と2を完了してください。
Microsoft Entra ID サービスプリンシパルを作成するには、
Application Administratorロールまたは Microsoft Entra ID のApplication.ReadWrite.All権限が必要です。ストレージ アカウントにロールを割り当てるには、所有者であるか、ストレージ アカウントのユーザー アクセス管理者 Azure RBAC ロールを持つユーザーである必要があります。
Blob Storage は、 Microsoft Entra ID サービスプリンシパルをサポートしていません。
-
共有アクセス署名 (SAS): ストレージSAS トークンを使用してAzureストレージにアクセスできます。SASでは、きめ細かなアクセス制御を備えた一時トークンを使用して、ストレージアカウントへのアクセスを制限できます。
SASトークンに付与できるのは、ストレージアカウント、コンテナ、またはファイルに対して自分自身が持っている権限のみです。
-
アカウント keys : ストレージ アカウント アクセス キー を使用して、 Azure Storage へのアクセスを管理できます。 ストレージ アカウント アクセス キーを使用すると、ストレージ アカウントの構成とデータへのフル アクセスが提供されます。 Databricks では、アカウント キーの代わりに Microsoft Entra ID サービスプリンシパルまたは SAS トークンを使用して Azure ストレージに接続することをお勧めします。
アカウントのアクセスキーを表示するには、Storage アカウントに対する Owner、Contributor、または Storage アカウント Key Operator サービス ロールが必要です。
Databricks では、すべての資格情報の保存にシークレットスコープを使用することをお勧めします。 ワークスペース内のユーザー、サービスプリンシパル、およびグループに、シークレットスコープを読み取るためのアクセス権を付与できます。 これにより、Azure の資格情報が保護され、ユーザーは Azure ストレージにアクセスできるようになります。 シークレットスコープを作成するには、「 シークレットスコープの管理」を参照してください。
Spark プロパティを設定して、Azure 資格情報を構成する
Spark プロパティを設定して、Azure ストレージにアクセスするための Azure 資格情報を構成できます。資格情報のスコープは、クラスターまたはノートブックのいずれかに設定できます。クラスターアクセス制御とノートブックアクセス制御の両方を一緒に使用して、Azureストレージへのアクセスを保護してください。コンピュートの権限とDatabricksノートブックを使用した共同作業を参照してください。
Sparkプロパティを設定するには、クラスターのSpark設定またはノートブックで次のスニペットを使用します。
- Azure service principal
- SAS tokens
- Account key
次の形式を使用して、クラスターのSpark構成を設定します。
spark.hadoop.fs.azure.account.auth.type.<storage-account>.dfs.core.windows.net OAuth
spark.hadoop.fs.azure.account.oauth.provider.type.<storage-account>.dfs.core.windows.net org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider
spark.hadoop.fs.azure.account.oauth2.client.id.<storage-account>.dfs.core.windows.net <application-id>
spark.hadoop.fs.azure.account.oauth2.client.secret.<storage-account>.dfs.core.windows.net {{secrets/<secret-scope>/<service-credential-key>}}
spark.hadoop.fs.azure.account.oauth2.client.endpoint.<storage-account>.dfs.core.windows.net https://login.microsoftonline.com/<directory-id>/oauth2/token
次の例に示すように、ノートブックで spark.conf.set を使用できます。
service_credential = dbutils.secrets.get(scope="<secret-scope>",key="<service-credential-key>")
spark.conf.set("fs.azure.account.auth.type.<storage-account>.dfs.core.windows.net", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type.<storage-account>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id.<storage-account>.dfs.core.windows.net", "<application-id>")
spark.conf.set("fs.azure.account.oauth2.client.secret.<storage-account>.dfs.core.windows.net", service_credential)
spark.conf.set("fs.azure.account.oauth2.client.endpoint.<storage-account>.dfs.core.windows.net", "https://login.microsoftonline.com/<directory-id>/oauth2/token")
置き換え
<secret-scope>をDatabricksシークレットスコープ名に置き換えます。<service-credential-key>をクライアントシークレットを含むキーの名前に置き換えます。<storage-account>をAzureストレージアカウント名に置き換えます。<application-id>には、Microsoft Entra IDアプリケーションの アプリケーション(クライアント)ID を指定します。<directory-id>には、Microsoft Entra IDアプリケーションの ディレクトリ(テナント)ID を指定します。
同じSparkセッションで複数のストレージアカウントのSASトークンを構成できます。
spark.conf.set("fs.azure.account.auth.type.<storage-account>.dfs.core.windows.net", "SAS")
spark.conf.set("fs.azure.sas.token.provider.type.<storage-account>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.sas.FixedSASTokenProvider")
spark.conf.set("fs.azure.sas.fixed.token.<storage-account>.dfs.core.windows.net", dbutils.secrets.get(scope="<scope>", key="<sas-token-key>"))
置き換え
<storage-account>をAzureストレージアカウント名に置き換えます。<scope>をDatabricksシークレットスコープ名に置き換えます。<sas-token-key>をAzureストレージのSASトークンを含むキーの名前に置き換えます。
spark.conf.set(
"fs.azure.account.key.<storage-account>.dfs.core.windows.net",
dbutils.secrets.get(scope="<scope>", key="<storage-account-access-key>"))
置き換え
<storage-account>をAzureストレージアカウント名に置き換えます。<scope>をDatabricksシークレットスコープ名に置き換えます。<storage-account-access-key>をAzureストレージアカウントのアクセスキーを含むキーの名前に置き換えます。
ステップ 4: Azure Storageにアクセスする
Azureストレージコンテナにアクセスするための資格情報を適切に設定したら、URIを使ってストレージアカウント内のリソースを操作できるようになります。Databricksでは、セキュリティを強化するために abfss ドライバーを使用することをお勧めします。
spark.read.load("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/<path-to-data>")
dbutils.fs.ls("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/<path-to-data>")
CREATE TABLE <database-name>.<table-name>;
COPY INTO <database-name>.<table-name>
FROM 'abfss://container@storageAccount.dfs.core.windows.net/path/to/folder'
FILEFORMAT = CSV
COPY_OPTIONS ('mergeSchema' = 'true');
ノートブックの例
ADLS OAuth 2.0 with Microsoft Entra ID (formerly Azure Active Directory) サービスプリンシパル ノートブック
Azure データレイク Storage の既知の問題
Azureポータルを使用して作成されたストレージコンテナにアクセスしようとすると、次のエラーが表示されることがあります。
StatusCode=404
StatusDescription=The specified filesystem does not exist.
ErrorCode=FilesystemNotFound
ErrorMessage=The specified filesystem does not exist.
階層型名前空間が有効になっている場合は、Azure portal を使用してコンテナーを作成する必要はありません。この問題が発生した場合は、Azure portal を使用して BLOB コンテナーを削除します。数分後、コンテナにアクセスできるようになります。または、 abfss URI を変更して別のコンテナーを使用することもできます (ただし、このコンテナーが Azure portal を使用して作成されていない限り)。
Azureドキュメントの「 データレイク ストレージの既知の問題 Microsoft」を参照してください。
Databricks からのデータの保存とアクセスに関する非推奨のパターン
非推奨のストレージパターンを次に示します。
- Databricks では、外部データの場所を Databricks ファイル システムにマウントすることは推奨されなくなりました。「Databricks へのクラウド オブジェクト ストレージのマウント」を参照してください。