Azure Data Lake Storage Gen2およびBlob Storageに接続する

この記事では、DatabricksからAzure Data Lake Storage Gen2とBlob Storageに接続する方法について説明します。

注:

Azure資格情報を使用してAzure Data Lake Storage Gen2またはBlob Storageに接続する

次の資格情報を使用して、Azure Data Lake Storage Gen2またはBlob Storageにアクセスできます。

  • OAuth 2.0 with a Microsoft Entra ID サービスプリンシパル: Databricks Microsoft Entra ID サービスプリンシパルを使用して Azure Data Lake Storage Gen2に接続することをお勧めします。Microsoft Entra ID サービスプリンシパルを作成し、Azure ストレージ アカウントへのアクセスを提供するには、「サービス プリンシパル & Microsoft Entra ID(Azure Active Directory) を使用してストレージにアクセスする」を参照してください。

    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 ストレージに接続することをお勧めします。

    アカウントのアクセスキーを表示するには、ストレージアカウントの所有者、コントリビュータ、またはストレージアカウントキーオペレーターサービスのロールを持っている必要があります。

Databricks では、すべての資格情報の保存にシークレットスコープを使用することをお勧めします。 ワークスペース内のユーザー、サービスプリンシパル、およびグループに、シークレットスコープを読み取るためのアクセス権を付与できます。 これにより、Azure の資格情報が保護され、ユーザーは Azure ストレージにアクセスできるようになります。 シークレットスコープを作成するには、「 シークレットスコープの管理」を参照してください。

Sparkプロパティを設定して、AzureストレージにアクセスするためのAzure資格情報を構成

Sparkプロパティを設定して、AzureストレージにアクセスするためのAzure資格情報を構成できます。資格情報の範囲は、クラスターでもノートブックでも構いません。クラスターアクセス制御とノートブックアクセス制御の両方を一緒に使用して、Azureストレージへのアクセスを保護してください。コンピュート権限Databricksノートブックを使用した共同作業を参照してください。

Sparkプロパティを設定するには、クラスターのSpark構成またはノートブックで次のスニペットを使用します。

次の形式を使用して、クラスターの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ストレージアカウントのアクセスキーを含むキーの名前に置き換えます。

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 Gen2 OAuth 2.0とMicrosoft Entra ID (旧称 Azure Active Directory) サービスプリンシパルノートブック

ノートブックを新しいタブで開く

Azure Data Lake Storage Gen2の既知の問題

Azureポータルを使用して作成されたストレージコンテナにアクセスしようとすると、次のエラーが表示されることがあります。

StatusCode=404
StatusDescription=The specified filesystem does not exist.
ErrorCode=FilesystemNotFound
ErrorMessage=The specified filesystem does not exist.

階層型名前空間が有効になっている場合は、Azureポータルを使用してコンテナを作成する必要はありません。この問題が発生した場合は、AzureポータルからBLOBコンテナを削除してください。数分後にコンテナにアクセスできるようになります。あるいは、このコンテナがAzureポータルを通じて作成されていない限り、 abfss URIを変更して別のコンテナを使用することもできます。

Microsoftドキュメントで「Azure Data Lake Storage Gen2の既知の問題」を参照してください。

Databricksからのデータの保存とアクセスのための非推奨のパターン

非推奨のストレージパターンを次に示します。