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

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

注:

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

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

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

    <entra-service-principal>を作成するには、Microsoft Entra ID (旧称 Azure Active Directory) の Application Administrator ロールまたは Application.ReadWrite.All アクセス許可が必要です。 ストレージ アカウントにロールを割り当てるには、所有者であるか、ストレージ アカウントのユーザー アクセス管理者 Azure RBAC ロールを持つユーザーである必要があります。

  • 共有アクセス署名 (SAS):ストレージSAS トークンを使用してAzureストレージにアクセスできます。SASでは、きめ細かなアクセス制御を備えた一時トークンを使用して、ストレージアカウントへのアクセスを制限できます。

    SASトークンに付与できるのは、ストレージアカウント、コンテナ、またはファイルに対して自分自身が持っている権限のみです。

  • アカウント キー: ストレージ アカウント アクセス キー を使用して、Azure Storage へのアクセスを管理できます。 ストレージ アカウント アクセス キーは、ストレージ アカウントの構成とデータへのフル アクセスを提供します。 Databricks では、アカウント キーの代わりに <entra-service-principal> または SAS トークンを使用して Azure Storage に接続することをお勧めします。

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

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> をAzur Storageアカウント名に置き換えます。

  • <scope> をDatabricksシークレットスコープ名に置き換えます。

  • <sas-token-key> をAzure Storage 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> をAzur Storageアカウント名に置き換えます。

  • <scope> をDatabricksシークレットスコープ名に置き換えます。

  • <storage-account-access-key> をAzur Storageアカウントのアクセスキーを含むキーの名前に置き換えます。

Azur 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 portal を使用して作成されたストレージ コンテナーにアクセスしようとすると、次のエラーが表示されることがあります。

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 で作成されていない限り、別のコンテナーを使用することもできます。

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

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

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