Azure DatabricksのデータソースとしてAzure Blob Storageを用いる場合の接続方法


Azure DatabricksからAzure Blob Storage内のデータにアクセスする際どのように行えばいいのか調べてみたところ思ったより複雑だったため、まとめておきます。

基本的には2種類あり、

  • Databricks File System(DBFS)にBlob Storageをマウントする
  • Databricksのセル内にBlob Storageへのアクセスキーを記載し接続する(非セキュア)

今回は前者に関して見ていきます。

各種リソースの作成

  • Azure Storage account
  • Azure Databricks
  • Key Container:DatabricksとBlob Storageの間の認証に使うKeyVault用

今回はDatabricks側にシークレットのスコープ(キーのコレクション)を登録することで、Blob Storageと接続します。

まずは、Storage Accountに対するアクセスキーをシークレットとしてKeyVaultに格納します。作成したStorage Accountから、[アクセス キー]に移動しkey1をコピーします。


次にそのキーをキーコンテナ―にシークレットとして配置します。作成したキーコンテナ―から、[シークレット]に移動し[生成/インポート]を選択します。

  • アップロードオプション:手動
  • 名前、コンテンツの種類:任意
  • 値:ストレージアカウントのアクセスキー

を設定し、作成します。

続いてDatabricks側の設定に移ります。
Azure Databricks instanceの[概要]から、URLを確認します。

そのURLに対し以下のような形でアクセスします。

https://<your_azure_databricks_url>#secrets/createScope

キーコンテナーの[プロパティ]から各種値をコピペして設定します。Manage PrincipalはCreatorにするとエラーになりました。

設定後[Create]します。これにより、KeyVaultがDatabricksのScopeに登録できました。

続いて、sampleデータをBlob Storageのコンテナにアップロードしておきます。ここではsamplecontainerを作成し、sales.txtをアップロードしています。

最後に、Databricksのnotebookから接続を確認します。クラスターは適宜作成してください。ノートブックのセルに対して以下コードを実行します。

dbutils.fs.mount(
  source = "wasbs://<container-name>@<storage-account-name>.blob.core.windows.net",
  mount_point = "/mnt/<mount-name>",
  extra_configs = {"fs.azure.account.key.<storage-account-name>.blob.core.windows.net":dbutils.secrets.get(scope = "<scope-name>", key = "<key-name>")})

mount関数に対してTrueが帰れば成功です。Cmd2の方では中身の確認をしています。

reference