Databricks へのクラウド オブジェクト ストレージの マウント

Databricks を使用すると、ユーザーはクラウド オブジェクト ストレージを Databricks ファイル システム (DBFS) にマウントして、クラウドの概念に慣れていないユーザーのデータ アクセス パターンを簡素化できます。 マウントされたデータは Unity Catalog では機能しないため、Databricks ではマウントの使用から移行し、代わりに Unity Catalog を使用してデータガバナンスを管理することをお勧めします。

Databricks はクラウド オブジェクト ストレージをどのようにマウントしますか?

Databricks マウントは、ワークスペースとクラウド オブジェクト ストレージの間にリンクを作成し、Databricks ファイル システムに関連する使い慣れたファイル パスを使用してクラウド オブジェクト ストレージと対話できるようにします。 マウントは、次の情報を格納する /mnt ディレクトリの下にローカルエイリアスを作成することによって機能します。

  • クラウドオブジェクトストレージの場所。

  • ストレージ アカウントまたはコンテナーに接続するためのドライバーの仕様。

  • データへのアクセスに必要なセキュリティ資格情報。

ストレージをマウントするための構文は何ですか?

source は、オブジェクト・ストレージのURIを指定します(オプションでセキュリティ資格証明をエンコードできます)。mount_point は、 /mnt ディレクトリ内のローカル パスを指定します。一部のオブジェクト・ストレージ・ソースでは、オプションの encryption_type 引数がサポートされています。 一部のアクセスパターンでは、追加のコンフィギュレーション仕様をディクショナリとして extra_configsに渡すことができます。

Databricks では、 extra_configsを使用して、マウント固有の Spark と Hadoop の構成をオプションとして設定することをお勧めします。 これにより、構成がクラスターやセッションではなくマウントに結び付けられます。

dbutils.fs.mount(
  source: str,
  mount_point: str,
  encryption_type: Optional[str] = "",
  extra_configs: Optional[dict[str:str]] = None
)

不適切な構成は、ワークスペース内のすべてのユーザーにセキュリティで保護されていないアクセスを提供する可能性があるため、データマウントを構成または変更する前に、ワークスペース管理者とクラウド管理者に確認してください。

この記事で説明されているアプローチに加えて、 Databricks Terraform プロバイダーdatabricks_mount を使用してバケットのマウントを自動化できます。

マウントポイント のアンマウント

マウントポイントをアンマウントするには、次のコマンドを使用します。

dbutils.fs.unmount("/mnt/<mount-name>")

警告

エラーを回避するには、他のジョブがマウント・ポイントの読み取りまたは書き込みを行っている間は、マウント・ポイントを変更しないでください。 マウントを変更した後は、必ず他のすべての稼働中のクラスターで dbutils.fs.refreshMounts() を実行して、マウントの更新を伝達します。 refreshMounts コマンド (dbutils.fs.refreshMounts)を参照してください。

S3 バケット をマウントする

S3 バケットは、「 Databricks ファイルシステム (DBFS) とは」を使用してマウントできます。マウントは S3 の場所へのポインタであるため、データがローカルに同期されることはありません。

クラスターを介してマウント ポイントが作成されると、そのクラスターのユーザーはすぐにマウント ポイントにアクセスできます。 別の稼働中のクラスターでマウント ポイントを使用するには、その稼働中のクラスターで dbutils.fs.refreshMounts() を実行して、新しく作成したマウント ポイントを使用できるようにする必要があります。

次の方法を使用して、S3 バケットをマウントできます。

AWS インスタンスプロファイルを使用したバケットのマウント

AWS インスタンスプロファイルを使用して、S3 バケットの認証と承認を管理できます。 バケット内のオブジェクトへのアクセスは、インスタンスプロファイルに付与されたアクセス許可によって決まります。 ロールに書き込みアクセス権がある場合、マウントポイントのユーザーはバケットにオブジェクトを書き込むことができます。 ロールに読み取りアクセス権がある場合、マウントポイントのユーザーはバケット内のオブジェクトを読み取ることができます。

  1. インスタンスプロファイルを使用してクラスターを設定します。

  2. バケットをマウントします。

    aws_bucket_name = "<aws-bucket-name>"
    mount_name = "<mount-name>"
    dbutils.fs.mount(f"s3a://{aws_bucket_name}", f"/mnt/{mount_name}")
    display(dbutils.fs.ls(f"/mnt/{mount_name}"))
    
    val AwsBucketName = "<aws-bucket-name>"
    val MountName = "<mount-name>"
    
    dbutils.fs.mount(s"s3a://$AwsBucketName", s"/mnt/$MountName")
    display(dbutils.fs.ls(s"/mnt/$MountName"))
    

AWS キーを使用してバケットをマウントする

AWS キーを使用してバケットをマウントできます。

重要

キーを使用して S3 バケットをマウントすると、 すべてのユーザー に S3 バケット内のすべての オブジェクト に対する読み取りおよび書き込みアクセス権が付与されます。

次の例では、Databricks シークレット を使用してキーを格納します。 シークレットキーを URL エスケープする必要があります

access_key = dbutils.secrets.get(scope = "aws", key = "aws-access-key")
secret_key = dbutils.secrets.get(scope = "aws", key = "aws-secret-key")
encoded_secret_key = secret_key.replace("/", "%2F")
aws_bucket_name = "<aws-bucket-name>"
mount_name = "<mount-name>"

dbutils.fs.mount(f"s3a://{access_key}:{encoded_secret_key}@{aws_bucket_name}", f"/mnt/{mount_name}")
display(dbutils.fs.ls(f"/mnt/{mount_name}"))
val AccessKey = dbutils.secrets.get(scope = "aws", key = "aws-access-key")
// Encode the Secret Key as that can contain "/"
val SecretKey = dbutils.secrets.get(scope = "aws", key = "aws-secret-key")
val EncodedSecretKey = SecretKey.replace("/", "%2F")
val AwsBucketName = "<aws-bucket-name>"
val MountName = "<mount-name>"

dbutils.fs.mount(s"s3a://$AccessKey:$EncodedSecretKey@$AwsBucketName", s"/mnt/$MountName")
display(dbutils.fs.ls(s"/mnt/$MountName"))

AssumeRole ポリシーでインスタンスプロファイルを使用してバケットをマウントする

最初に、 AssumeRole ポリシーを使用してアクセスクロスアカウント S3 バケットを設定する必要があります。

extraConfigsでS3オプションを設定しながらバケットをマウントします。

dbutils.fs.mount("s3a://<s3-bucket-name>", "/mnt/<s3-bucket-name>",
  extra_configs = {
    "fs.s3a.credentialsType": "AssumeRole",
    "fs.s3a.stsAssumeRole.arn": "arn:aws:iam::<bucket-owner-acct-id>:role/MyRoleB",
    "fs.s3a.canned.acl": "BucketOwnerFullControl",
    "fs.s3a.acl.default": "BucketOwnerFullControl"
  }
)
dbutils.fs.mount("s3a://<s3-bucket-name>", "/mnt/<s3-bucket-name>",
  extraConfigs = Map(
    "fs.s3a.credentialsType" -> "AssumeRole",
    "fs.s3a.stsAssumeRole.arn" -> "arn:aws:iam::<bucket-owner-acct-id>:role/MyRoleB",
    "fs.s3a.canned.acl" -> "BucketOwnerFullControl",
    "fs.s3a.acl.default" -> "BucketOwnerFullControl"
  )
)

S3 バケット内のデータを暗号化する

Databricks では、サーバー側の暗号化を使用したデータの暗号化がサポートされています。 このセクションでは、DBFS を介して S3 にファイルを書き込むときにサーバー側の暗号化を使用する方法について説明します。 Databricks は、Amazon S3 で管理された暗号化キー (SSE-S3)AWS KMS で管理された暗号化キー (SSE-KMS) をサポートしています。

SSE-S3 を使用したファイルの書き込み

  1. SSE-S3 を使用して S3 バケットをマウントするには、次のコマンドを実行します。

    dbutils.fs.mount(s"s3a://$AccessKey:$SecretKey@$AwsBucketName", s"/mnt/$MountName", "sse-s3")
    
  2. SSE-S3 を使用して対応する S3 バケットにファイルを書き込むには、次のコマンドを実行します。

    dbutils.fs.put(s"/mnt/$MountName", "<file content>")
    

SSE-KMS を使用したファイルの書き込み

  1. 暗号化の種類として sse-kms または sse-kms:$KmsKey を渡してソース ディレクトリをマウントします。

    • デフォルトの KMS マスターキーを使用して SSE-KMS で S3 バケットをマウントするには、次のコマンドを実行します。

      dbutils.fs.mount(s"s3a://$AccessKey:$SecretKey@$AwsBucketName", s"/mnt/$MountName", "sse-kms")
      
    • 特定の KMS キーを使用して SSE-KMS で S3 バケットをマウントするには、次のコマンドを実行します。

      dbutils.fs.mount(s"s3a://$AccessKey:$SecretKey@$AwsBucketName", s"/mnt/$MountName", "sse-kms:$KmsKey")
      
  2. SSE-KMS を使用して S3 バケットにファイルを書き込むには、次のコマンドを実行します。

    dbutils.fs.put(s"/mnt/$MountName", "<file content>")
    

Databricks コミットサービス を使用した S3 バケットのマウント

複数のクラスターまたはワークロードから S3 に格納されている特定のテーブルに同時に書き込む場合は、 Databricks S3 コミット サービスを構成することをお勧めします。 ノートブックコードでバケットをマウントし、 AssumeRole 設定を追加する必要があります。 このステップは、DBFS マウントにのみ必要であり、ワークスペースのルート S3 バケット内の ルート DBFS ストレージにアクセスするためには必要ありません。 次の例では、Python を使用します。


# If other code has already mounted the bucket without using the new role, unmount it first
dbutils.fs.unmount("/mnt/<mount-name>")

# mount the bucket and assume the new role
dbutils.fs.mount("s3a://<bucket-name>/", "/mnt/<mount-name>", extra_configs = {
    "fs.s3a.credentialsType": "AssumeRole",
    "fs.s3a.stsAssumeRole.arn": "<role-arn>"
})

ABFS を使用して ADLS Gen2 または BLOB ストレージをマウントする

認証に Microsoft Entra ID (旧称 Azure Active Directory) アプリケーション サービスプリンシパルを使用して、Azure ストレージ アカウントにデータをマウントできます。 詳細については、「 サービスプリンシパルを使用して Microsoft Entra ID (旧称 Azure Active Directory) でストレージにアクセスする」を参照してください。

重要

  • Databricks ワークスペース内のすべてのユーザーが、マウントされた ADLS Gen2 アカウントにアクセスできます。 ADLS Gen2 アカウントへのアクセスに使用するサービスプリンシパルには、その ADLS Gen2 アカウントへのアクセスのみを付与する必要があります。他の Azure リソースへのアクセス権は付与しないでください。

  • クラスターを介してマウント ポイントを作成すると、クラスター ユーザーはすぐにマウント ポイントにアクセスできます。 別の稼働中のクラスターでマウントポイントを使用するには、その稼働中のクラスターで dbutils.fs.refreshMounts() を実行して、新しく作成したマウントポイントを使用できるようにする必要があります。

  • ジョブの実行中にマウントポイントをアンマウントすると、エラーが発生する可能性があります。 実動ジョブが処理の一部としてストレージをアンマウントしないようにします。

  • シークレットを使用するマウントポイントは自動的に更新されません。 マウントされたストレージが、ローテーション、期限切れ、または削除されるシークレットに依存している場合、 401 Unauthorizedなどのエラーが発生する可能性があります。 このようなエラーを解決するには、ストレージをアンマウントして再マウントする必要があります。

  • ABFS エンドポイントを使用して Azure Data Lake Storage Gen2 ストレージ アカウントを正常にマウントするには、階層型名前空間 (HNS) を有効にする必要があります。

ノートブックで次のコマンドを実行して、マウント ポイントを認証して作成します。

configs = {"fs.azure.account.auth.type": "OAuth",
          "fs.azure.account.oauth.provider.type": "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
          "fs.azure.account.oauth2.client.id": "<application-id>",
          "fs.azure.account.oauth2.client.secret": dbutils.secrets.get(scope="<scope-name>",key="<service-credential-key-name>"),
          "fs.azure.account.oauth2.client.endpoint": "https://login.microsoftonline.com/<directory-id>/oauth2/token"}

# Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
  source = "abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/",
  mount_point = "/mnt/<mount-name>",
  extra_configs = configs)
val configs = Map(
  "fs.azure.account.auth.type" -> "OAuth",
  "fs.azure.account.oauth.provider.type" -> "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
  "fs.azure.account.oauth2.client.id" -> "<application-id>",
  "fs.azure.account.oauth2.client.secret" -> dbutils.secrets.get(scope="<scope-name>",key="<service-credential-key-name>"),
  "fs.azure.account.oauth2.client.endpoint" -> "https://login.microsoftonline.com/<directory-id>/oauth2/token")
// Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
  source = "abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/",
  mountPoint = "/mnt/<mount-name>",
  extraConfigs = configs)

取り替える

  • <application-id> を Azure Active Directory アプリケーションの アプリケーション (クライアント) ID に置き換えます。

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

  • <service-credential-key-name> は、クライアント シークレットを含むキーの名前です。

  • <directory-id> を Azure Active Directory アプリケーションの ディレクトリ (テナント) ID に置き換えます。

  • <container-name> を ADLS Gen2 ストレージ アカウント内のコンテナーの名前に置き換えます。

  • <storage-account-name> を ADLS Gen2 ストレージ アカウント名に置き換えます。

  • <mount-name> を DBFS 内の目的のマウント ポイントの名前に置き換えます。