WASB (レガシ) を使用した Azure Blob Storage への接続

Microsoft は、Azure Blob File System ドライバー (ABFS) を優先することに伴って Azure Blob Storage 用の Windows Azure Storage Blob ドライバー (WASB) を非推奨にしました。「Azure Databricks で Azure Data Lake Storage Gen2 と Blob Storage に接続する」を参照してください。 ABFS には WASB より多くの利点があります。ABFS に関する Azure のドキュメントをご覧ください。

この記事では、WASB ドライバーを使用するコードを保守するためのドキュメントを提供します。 Databricks では、Azure Blob Storage へのすべての接続に ABFS を使用することをお勧めしています。

Databricks で WASB 資格情報を構成する

WASB ドライバーを使用すると、ストレージ アカウント アクセス キーまたは Shared Access Signature (SAS) のいずれかを使用できます。 (パブリック ストレージ アカウントからデータを読み取る場合は、資格情報を構成する必要はありません)。

Databricks では、Azure Databricks で資格情報を渡す必要がある場合は常にシークレットを使用することをお勧めしています。 シークレットは、含まれているシークレット スコープへのアクセス権があるすべてのユーザーが使用できます。

次の場合に、資格情報を渡すことができます。

  • Spark 構成でクラスターに範囲が設定されている
  • ノートブックに範囲が設定されている
  • マウントされたディレクトリに接続されている

Databricks では、すべての接続をアップグレードして ABFS を使用して Azure Blob Storage にアクセスすることをお勧めしています。これにより WASB と同様のアクセス パターンが提供されます。 ABFS を使用して、Azure Blob Storage とやりとりするときに最適なセキュリティとパフォーマンスを実現します。

クラスターの資格情報を構成するには、クラスターの作成時に Spark の構成プロパティを設定します。 クラスター レベルで設定された資格情報は、そのクラスターにアクセスできるすべてのユーザーが使用できます。

ノートブックに範囲が設定された資格情報を構成するには、spark.conf.set() を使用します。 ノートブック レベルで渡された資格情報は、そのノートブックにアクセスできるすべてのユーザーが使用できます。

ストレージ アカウント アクセス キーを使って Azure Blob Storage 資格情報を設定する

ストレージ アカウント アクセス キーは、ストレージ アカウント内のすべてのコンテナーへのフル アクセスを許可します。 このパターンはプロトタイプ作成に役立ちますが、運用環境での使用を避けて、運用データへの無制限のアクセスを許可することに関するリスクを軽減してください。

spark.conf.set(
  "fs.azure.account.key.<storage-account-name>.blob.core.windows.net",
  "<storage-account-access-key>"
)

ABFS を使用するようにアカウント キー URI をアップグレードできます。 詳細については、「Azure Data Lake Storage Gen2 と Blob Storage に接続する」を参照してください。

Shared Access Signature (SAS) を使用した Azure Blob Storage 資格情報の設定

SAS トークンを使用すると、ストレージ アカウント内の 1 つのコンテナーへの、特定の時刻に期限が切れる制限付きアクセスを構成できます。

spark.conf.set(
  "fs.azure.sas.<container-name>.<storage-account-name>.blob.core.windows.net",
  "<sas-token-for-container>"
)

DataFrame API を使用した Azure Blob Storage へのアクセス

Apache Spark DataFrame API では、ノートブックまたはクラスター レベルで構成された資格情報を使用できます。 すべての WASB ドライバー URI は、コンテナーとストレージ アカウント名を指定します。 ディレクトリ名は省略可能で、コンテナーに関連する複数の入れ子になったディレクトリを指定できます。

wasbs://<container-name>@<storage-account-name>.blob.core.windows.net/<directory-name>

次のコード例は、DataFrames API と Databricks ユーティリティ (dbutils) リファレンスを使って、コンテナー内の名前付きディレクトリとやりとりする方法を示しています。

df = spark.read.format("parquet").load("wasbs://<container-name>@<storage-account-name>.blob.core.windows.net/<directory-name>")

dbutils.fs.ls("wasbs://<container-name>@<storage-account-name>.blob.core.windows.net/<directory-name>")

WASB ではなく ABFS を更新するには、URI を更新します。 詳細については、Azure Storage へのアクセスに関する記事を参照してください

SQL を使用した Azure Blob Storage へのアクセス

ノートブックのセッション構成に設定されている資格情報は、Spark SQL を実行しているノートブックにはアクセスできません。

クラスター構成でアカウント アクセス キーまたは SAS が設定されたら、Azure Blob Storage で標準の Spark SQL クエリを使用できます。

-- SQL
CREATE DATABASE <db-name>
LOCATION "wasbs://<container-name>@<storage-account-name>.blob.core.windows.net/";

WASB ではなく ABFS を更新するには、URI を更新します (Azure Storage へのアクセスに関する記事を参照してください)

Azure Blob Storage コンテナーを DBFS にマウントする

Azure Blob Storage コンテナーまたはコンテナー内のフォルダーを DBFS にマウントできます。 Databricks の推奨事項については、「Azure Databricks へのクラウド オブジェクト ストレージのマウント」をご覧ください。

重要

  • Azure Blob Storage では、ブロック、追加、ページの 3 種類の BLOB がサポートされています。 DBFS にマウントできるのは "ブロック" BLOB のみです。
  • すべてのユーザーは、DBFS にマウントされた Blob Storage コンテナー内のオブジェクトに対する読み取りと書き込みのアクセス権を持ちます。
  • クラスターを介してマウント ポイントを作成すると、そのクラスターのユーザーはそのマウント ポイントにすぐにアクセスできるようになります。 別の実行中のクラスターのマウント ポイントを使用するには、その実行中のクラスターで dbutils.fs.refreshMounts() を実行して、新しく作成されたマウント ポイントを使用できるようにする必要があります。

DBFS では、マウント ポイントを作成するときに指定した資格情報を使用して、マウントされた Blob Storage コンテナーにアクセスします。 Blob Storage コンテナーがストレージ アカウントのアクセス キーを使用してマウントされている場合、DBFS では、このマウント ポイントにアクセスする際に、ストレージ アカウント キーから派生した一時 SAS トークンが使用されます。

Azure BLOB ストレージ コンテナーをマウントする

Databricks では、WASB ではなく ABFS を使用することをお勧めしています。 ABFS を使用したマウントの詳細については、「ABFS を使用して ADLS Gen2 または Blob Storage をマウントする」をご覧ください。

  1. Blob Storage コンテナーまたはコンテナー内のフォルダーをマウントするには、次のコマンドを使用します。

    Python

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

    Scala

    dbutils.fs.mount(
      source = "wasbs://<container-name>@<storage-account-name>.blob.core.windows.net/<directory-name>",
      mountPoint = "/mnt/<mount-name>",
      extraConfigs = Map("<conf-key>" -> dbutils.secrets.get(scope = "<scope-name>", key = "<key-name>")))
    

    where

    • <storage-account-name>: Azure Blob Storage アカウントの名前です。
    • <container-name>: Azure Blob Storage アカウント内のコンテナーの名前です。
    • <mount-name>: Blob Storage コンテナーまたは (source で指定された) コンテナー内のフォルダーがマウントされる DBFS 内の場所を表す DBFS パスです。
    • <conf-key>: fs.azure.account.key.<storage-account-name>.blob.core.windows.net または fs.azure.sas.<container-name>.<storage-account-name>.blob.core.windows.net のいずれかです
    • dbutils.secrets.get(scope = "<scope-name>", key = "<key-name>"): シークレットのスコープシークレットとして格納されているキーを取得します。
  2. コンテナー内のファイルに、ローカル ファイルの場合と同様にアクセスします。次に例を示します。

    Python

    # python
    df = spark.read.format("text").load("/mnt/<mount-name>/...")
    df = spark.read.format("text").load("dbfs:/<mount-name>/...")
    

    Scala

    // scala
    val df = spark.read.format("text").load("/mnt/<mount-name>/...")
    val df = spark.read.format("text").load("dbfs:/<mount-name>/...")
    

    SQL

    -- SQL
    CREATE DATABASE <db-name>
    LOCATION "/mnt/<mount-name>"