共用方式為


連線與 WASB Azure Blob 儲存體 (舊版)

Microsoft 已淘汰 Azure Blob 儲存體 windows Azure 儲存體 Blob 驅動程式 (WASB),以偏向 Azure Blob 檔案系統驅動程式 (ABFS):請參閱 Azure Data Lake 儲存體 Gen2 和 Blob 儲存體連線 。 ABFS 對 WASB 有許多好處:請參閱 ABFS 上的 Azure 檔。

本文提供維護使用 WASB 驅動程式的程式碼的檔。 Databricks 建議針對Azure Blob 儲存體的所有連線使用 ABFS。

在 Databricks 中設定 WASB 認證

WASB 驅動程式可讓您使用 儲存體帳戶存取金鑰 共用存取簽章(SAS)。 (如果您要從公用儲存體帳戶讀取資料,則不需要設定認證。

每當您需要在 Azure Databricks 中傳遞認證時,Databricks 建議使用 秘密 。 秘密可供具有包含 秘密範圍 存取權的所有使用者使用。

您可以傳遞認證:

  • 範圍設定為 Spark 組態中的叢集
  • 範圍設定為筆記本
  • 附加至掛接的目錄

Databricks 建議將所有連線升級為 使用 ABFS 來存取Azure Blob 儲存體 ,其提供與 WASB 類似的存取模式。 與Azure Blob 儲存體互動時,請使用 ABFS 獲得最佳安全性和效能。

若要設定叢集認證,請在建立叢集時設定 Spark 組態 屬性。 在叢集層級設定的認證可供具有該叢集存取權的所有使用者使用。

若要設定筆記本範圍的認證,請使用 spark.conf.set() 。 在筆記本層級傳遞的認證可供具有該筆記本存取權的所有使用者使用。

使用儲存體帳戶存取金鑰設定Azure Blob 儲存體認證

儲存體帳戶存取金鑰會授與儲存體帳戶內所有容器的完整存取權。 雖然此模式適用于原型設計,但請避免在生產環境中使用它,以降低與授與對生產資料不受限制存取相關聯的風險。

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

您可以將帳戶金鑰 URI 升級為使用 ABFS。 如需詳細資訊,請參閱 連線至 Azure Data Lake Storage Gen2 和 Blob 儲存體

使用共用存取簽章設定Azure Blob 儲存體認證 (SAS)

您可以使用 SAS 權杖來設定特定時間到期之儲存體帳戶中單一容器的有限存取權。

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

使用 DataFrame API 存取Azure Blob 儲存體

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>")

若要更新 ABFS 而不是 WASB,請更新您的 URI。 如需詳細資訊,請參閱 存取 Azure 儲存體

使用 SQL 存取Azure Blob 儲存體

執行 Spark SQL 的筆記本無法存取筆記本會話設定中設定的認證。

在叢集設定中設定帳戶存取金鑰或 SAS 之後,您可以使用標準 Spark SQL 查詢搭配Azure Blob 儲存體:

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

若要更新 ABFS 而非 WASB,請更新 URI;請參閱 存取 Azure 儲存體

將Azure Blob 儲存體容器掛接至 DBFS

您可以將Azure Blob 儲存體容器或容器內的資料夾掛接至 DBFS。 如需 Databricks 建議,請參閱 在 Azure Databricks 上掛接雲端物件儲存體。

重要

  • Azure Blob 儲存體支援 三種 Blob 類型 :區塊、附加和分頁。 您只能將區塊 Blob 掛接 至 DBFS。
  • 所有使用者對於掛接到 DBFS 的 Blob 儲存體容器中物件,都具有讀取和寫入存取權。
  • 透過叢集建立掛接點之後,該叢集的使用者就可以立即存取掛接點。 若要在另一個執行中的叢集中使用掛接點,您必須在該執行中的叢集上執行 dbutils.fs.refreshMounts() ,才能讓新建立的掛接點可供使用。

DBFS 會使用您在建立掛接點來存取已掛接的 Blob 儲存體容器時所提供的認證。 如果使用儲存體帳戶存取金鑰掛接 Blob 儲存體容器,DBFS 會在存取此掛接點時,使用衍生自儲存體帳戶金鑰的暫存 SAS 權杖。

掛接 Azure Blob 儲存體容器

Databricks 建議使用 ABFS 而不是 WASB。 如需使用 ABFS 掛接的詳細資訊,請參閱: 使用 ABFS 掛接 ADLS Gen2 或 Blob 儲存體。

  1. 若要在容器內掛接 Blob 儲存體容器或資料夾,請使用下列命令:

    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 儲存體帳戶的名稱。
    • <container-name> 是 Azure Blob 儲存體帳戶中的容器名稱。
    • <mount-name> 是 DBFS 路徑,代表 Blob 儲存體容器或容器內的資料夾在 DBFS 中掛接的位置 source
    • <conf-key> 可以是 fs.azure.account.key.<storage-account-name>.blob.core.windows.netfs.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>"