共用方式為


使用 WASB (舊版) 連線至 Azure Blob 儲存體

Microsoft已取代適用於 Azure Blob 儲存體 的 Windows Azure 儲存體 Blob 驅動程式 (WASB),而支援 Azure Blob 檔案系統驅動程式 (ABFS):請參閱連線到 Azure Data Lake Storage 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 儲存體

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

您可以使用 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>"