返回文章列表

Unity Catalog 資料位置管理與安全存取

本文探討 Unity Catalog 中資料位置的管理與安全存取機制,包含如何使用儲存卷、設定預設儲存位置、隔離目錄至特定工作空間,以及建立和管理外部儲存位置和儲存憑證。文章也說明瞭如何使用 Lakehouse Federation 查詢外部系統,並以建立生成式 AI 資料管道的例項示範如何從檔案中擷取文字。

資料工程 資料湖

Unity Catalog 提供了多種機制管理資料儲存位置,以滿足不同安全性和隔離需求。除了預設的儲存位置設定外,開發者可以利用儲存卷儲存各種格式的檔案,並透過設定目錄和架構層級的預設位置來控制資料存放。針對更精細的控制,可以設定表格層級的外部位置或使用儲存卷指定雲端儲存位置。此外,Unity Catalog 還支援目錄繫結功能,限制特定工作空間對目錄的存取,強化資料隔離。對於外部資料的存取,儲存憑證簡化了雲端服務驗證的流程,讓使用者無需處理複雜的組態設定。最後,Lakehouse Federation 允許查詢外部系統而無需資料遷移,進一步提升資料處理的彈性。

管理 Unity Catalog 中的資料位置

在某些情況下,您可能希望將資料資產儲存在與中繼資料函式庫預設位置不同的儲存位置。例如,對於包含敏感資料(如個人可識別資訊(PII)或受保護的健康資訊(PHI)資料)的特權資料集,您可能希望將這些資料集儲存在獨立的儲存帳戶中。或者,您可能有合約義務,要求將資料儲存在隔離的儲存帳戶中。總之,資料隔離的需求相當常見。在下一節中,我們將探討 Unity Catalog 中的另一個可安全存取的物件,它允許資料管理員安全地儲存任意型別的資料,同時保持與傳統表格和檢視的強隔離。

將資料儲存到 Unity Catalog 中的儲存卷

儲存卷可用於儲存各種格式的檔案。此外,儲存卷可以與表格和檢視一起儲存在 Unity Catalog 的架構中。雖然表格和檢視用於儲存結構化資料,但儲存卷可用於儲存結構化、半結構化或非結構化資料。

圖表翻譯:圖 6.2 – 儲存卷與表格和檢視一起儲存在 Unity Catalog 的架構中

此圖示展示了 Unity Catalog 中儲存卷、表格和檢視之間的關係。

儲存卷可以由 Databricks Data Intelligence Platform 管理,一旦刪除,儲存容器(包括儲存容器的所有內容)將被完全移除。另一方面,儲存卷也可以是外部卷,這意味著卷的所有者管理儲存卷的儲存位置,一旦刪除,儲存容器的內容不會被移除。

儲存卷簡化了在 Unity Catalog 中儲存檔案的過程,無需建立和管理外部儲存位置和儲存憑證物件。相反,外部位置需要建立並附帶儲存憑證,這使得組態和取消組態稍微複雜一些。

設定 Unity Catalog 中資料的預設位置

儲存卷為特定架構的使用者提供了在安全可靠的儲存位置儲存任意檔案的靈活性,該位置由 Databricks Data Intelligence Platform 管理。預設情況下,儲存卷會將資料儲存在父架構的預設儲存位置。例如,如果在建立架構時未提供儲存位置,則儲存卷中的資料將儲存在 Unity Catalog 中繼資料函式庫的預設儲存帳戶中。如果架構是使用明確的儲存位置建立的,則預設情況下,儲存卷將把其內容儲存在此雲端位置。

中繼資料函式倉管理員或具有在目錄中建立卷的明確許可權的特權使用者可以建立或刪除卷。以下範例授予 Databricks 使用者在 development_catalog 目錄上建立卷的明確許可權:

GRANT CREATE VOLUME
ON CATALOG development_catalog
TO `jane.smith@example.com`;

內容解密:

此 SQL 命令授予使用者 [email protected]development_catalog 目錄中建立卷的許可權。這使得使用者能夠在指定的目錄中建立和管理儲存卷。

完全合格的卷路徑是使用 /Volumes/ 後面跟著目錄、架構和卷名稱來建構的。例如,可以使用以下路徑參照任意文字檔案:

/Volumes/catalog_name/schema_name/volume_name/subdirectory_name/arbitrary_file.txt

在前面的範例中,我們讓 Databricks Data Intelligence Platform 決定如何使用架構、表格、檢視和卷來儲存資料。但是,我們也可以為某些可安全存取的物件設定指定的雲端位置。讓我們來看看如何使用 Unity Catalog 中的幾種技術來控制儲存位置。

在 Unity Catalog 中設定資料的預設位置

您可以使用 Unity Catalog 中的幾種技術來控制資料的儲存位置:

  • 目錄層級的預設位置:在建立新目錄時,資料管理員可以指定儲存位置。當建立資料資產(如表格)且未指定位置時,資料將儲存在目錄位置。
  • 架構層級的預設位置:同樣,您可以在架構層級指定預設位置。架構位置將覆寫在目錄層級指定的任何預設位置。當建立資料資產(如表格)且未指定位置時,資料將儲存在架構位置。
  • 表格層級的外部位置:這是資料管理員對其資料集最精細的控制。表格位置將覆寫在目錄或架構層級指定的任何預設位置。
  • 卷位置:與外部位置(在「在 Unity Catalog 中建立和管理外部儲存位置」一節中有介紹)密切相關,卷允許控制表格資料在雲端儲存中的儲存位置。

將目錄隔離到特定的工作區

預設情況下,當您在 Unity Catalog 中建立目錄時,該目錄將可供中繼資料函式倉管理員授予許可權,讓使用者跨所有使用該中繼資料函式庫的 Databricks 工作區存取。但是,在某些情況下,您可能希望覆寫此行為,並強制對駐留在特定目錄中的資料集實施更強的隔離。例如,敏感資料集可能僅在生產工作區中可用於資料管道處理,但不應在較低環境(如開發工作區)中使用。Unity Catalog 的一個功能稱為目錄繫結,有助於解決此類別場景。使用目錄繫結,目錄管理員(如中繼資料函式倉管理員或目錄所有者)可以控制哪些工作區可以存取特定的目錄。對於未繫結到特定目錄的 Databricks 工作區,該目錄不會出現在「目錄總覽」UI 的搜尋結果中。

圖表翻譯:圖 6.3 – 目錄繫結允許資料管理員控制每個工作區的資料隔離和隔離級別

此圖示展示了目錄繫結如何允許資料管理員控制每個工作區的資料隔離和隔離級別。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Unity Catalog 資料位置管理與安全存取

package "資料庫架構" {
    package "應用層" {
        component [連線池] as pool
        component [ORM 框架] as orm
    }

    package "資料庫引擎" {
        component [查詢解析器] as parser
        component [優化器] as optimizer
        component [執行引擎] as executor
    }

    package "儲存層" {
        database [主資料庫] as master
        database [讀取副本] as replica
        database [快取層] as cache
    }
}

pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中

master --> replica : 資料同步

note right of cache
  Redis/Memcached
  減少資料庫負載
end note

@enduml

圖表翻譯:

此圖表顯示了目錄與工作區之間的關係,以及目錄繫結如何控制對特定目錄的存取。只有被繫結的工作區才能存取該目錄中的資料。

在 Unity Catalog 中隔離目錄至特定工作空間

資料管理員可以控制哪些工作空間能夠存取特定的目錄,從而進一步隔離資料集。在 Databricks Data Intelligence Platform 中,可以使用 Catalog Explorer 或自動化工具(如 Terraform 或 REST API)來變更目錄的繫結設定。

使用 Databricks REST API 繫結目錄

首先,更新目錄的預設設定,使其不對所有使用 Unity Catalog 中繼儲存的工作空間開放。預設情況下,此屬性設定為 OPEN,我們希望將其隔離到指定的工作空間。

import requests

catalog = "testing_catalog"
response = requests.patch(
    f"https://{workspace_name}/api/2.1/unity-catalog/catalogs/{catalog}",
    headers={"Authorization": f"Bearer {api_token}"},
    json={"isolation_mode": "ISOLATED"}
)
print(response.json())

內容解密:

  • 使用 requests.patch 方法更新目錄的隔離模式。
  • isolation_mode 設定為 ISOLATED,確保目錄不再對所有工作空間開放。
  • 需要提供有效的 workspace_nameapi_token

接下來,使用 Catalog Explorer 驗證目錄的隔離模式是否已更新。在 Databricks 工作空間中,從左側邊欄選單導航到 Catalog Explorer,然後搜尋並點選目錄名稱。在 Catalog Explorer UI 中,驗證「All workspaces have access」核取方塊不再被勾選。

繫結目錄至特定工作空間

現在,目錄已不再對所有工作空間開放,我們希望將其繫結到特定的工作空間。在下一個範例中,我們將再次使用 Databricks REST API,允許生產工作空間中的資料管理員對目錄中的資料集指派唯讀存取許可權。

response = requests.patch(
    f"https://{workspace_name}/api/2.1/unity-catalog/bindings/catalog/{catalog}",
    headers={"Authorization": f"Bearer {api_token}"},
    json={"add": [{
        "workspace_id": <production_workspace_id>,
        "binding_type": "BINDING_TYPE_READ_ONLY"
    }]}
)
print(response.json())

內容解密:

  • 使用 requests.patch 方法更新目錄的繫結設定。
  • workspace_id 設定為指定的生產工作空間 ID,並將 binding_type 設定為 BINDING_TYPE_READ_ONLY,以指派唯讀存取許可權。
  • 需要提供有效的 workspace_nameapi_tokenproduction_workspace_id

管理 Unity Catalog 中的資料位置

在某些情況下,資料管理員需要控制雲端儲存位置,例如滿足合約義務或避免資料集在管線處理期間共置。在下一節中,我們將探討如何在 Unity Catalog 中指派特定的雲端位置給資料集。

在 Unity Catalog 中建立和管理外部儲存位置

Databricks 的一大優勢是資料的開放性,允許使用者連線到各種雲端原生儲存系統中的資料。然而,這些雲端原生儲存服務的整合需要複雜的組態設定,通常需要在筆記本執行的開始或叢集啟動時透過初始化指令碼進行設定。

使用儲存憑證簡化雲端服務驗證

Unity Catalog 提供了一種稱為儲存憑證的安全物件,旨在簡化這一維護任務,同時允許終端使用者儲存和連線到 Databricks Data Intelligence Platform 外部的資料集。雲端管理員或中繼儲存管理員可以在單一位置儲存雲端服務驗證詳細資訊,從而避免終端使用者需要組態複雜的雲端驗證詳細資訊。

# 連線到 ADLS Gen2 容器中的資料
account_name = "some_storage_account"
spark.conf.set(f"fs.azure.account.auth.type.{account_name}.dfs.core.windows.net", "SAS")
spark.conf.set(f"fs.azure.sas.token.provider.type.{account_name}.dfs.core.windows.net", 
               "org.apache.hadoop.fs.azurebfs.sas.FixedSASTokenProvider")
# 使用 Databricks Secret 安全地儲存和檢索用於驗證 ADLS 服務的 SAS 金鑰
spark.conf.set(
    f"fs.azure.sas.fixed.token.{account_name}.dfs.core.windows.net",
    dbutils.secrets.get(scope="sas_token_scope", key="sas_token_key")
)

內容解密:

  • 使用 spark.conf.set 方法設定 Spark 組態,以連線到 ADLS Gen2 容器中的資料。
  • 使用 Databricks Secret 安全地儲存和檢索 SAS 金鑰,以驗證 ADLS 服務。
  • 需要提供有效的 account_namesas_token_scopesas_token_key

使用儲存憑證儲存雲端服務驗證資訊

儲存憑證是 Unity Catalog 中的一種安全物件,它抽象化了存取雲端儲存帳戶所需的雲端原生憑證。例如,儲存憑證可以代表 Amazon Web Services(AWS)雲端中的 Identity and Access Management(IAM)角色,也可以代表 Azure 雲端中的受控識別或服務主體。一旦建立了儲存憑證,就可以透過明確的授權陳述式將存取許可權授予 Unity Catalog 中的使用者和群組。

在 Unity Catalog 中管理資料位置

在 Unity Catalog 中,儲存憑證(Storage Credential)是一種重要的安全物件,用於存取雲端儲存服務。儲存憑證與外部位置(External Location)結合使用,以存取特定雲端儲存帳戶中的資料。

建立和管理外部儲存位置

要在 Unity Catalog 中建立和管理外部儲存位置,您必須是 Databricks 帳戶管理員或 Unity Catalog 的 metastore 管理員。以下範例使用 Databricks CLI 工具建立新的儲存憑證:

databricks storage-credentials create \
--json '{"name": "my_storage_cred", ' \
'"aws_iam_role": {"role_arn": ' \
'"arn:aws:iam::<role_identifier>:role/<account_name>"}}'

接著,使用 SQL API 授予資料科學群組使用該憑證存取雲端儲存的許可權:

-- Grant access to create an external location using the storage cred
GRANT CREATE EXTERNAL LOCATION
ON STORAGE CREDENTIAL my_s3_bucket_cred
TO `data-science`;

使用 Lakehouse Federation 查詢外部系統

Lakehouse Federation 是 Databricks Data Intelligence Platform 的一項功能,允許使用者在不需將資料遷移到 lakehouse 的情況下查詢外部儲存系統。連線(Connection)是一種安全物件,用於將查詢聯合到外部系統。

建立 MySQL 連線

以下範例使用 SQL 連線 API 建立新的 MySQL 連線:

CREATE CONNECTION my_mysql_connection TYPE mysql
OPTIONS (
host '<fully_qualified_hostname>',
port '3306',
user secret('mysql_scope', 'mysql_username'),
password secret('mysql_scope', 'mysql_password')
)

檢視連線

可以在 Databricks Data Intelligence Platform 中檢視所有連線,方法是導航到 Catalog Explorer,展開 Connections 窗格,然後點選 Foreign Connection 以檢視先前建立的連線詳細資訊。

實作練習:為生成式 AI 管道擷取檔案文字

在本範例中,我們將建立一個典型的資料管道,用於從檔案中擷取文字,以供生成式 AI 使用。

產生模擬檔案

首先,建立一個新的筆記本,用於產生任意文字檔。以下程式碼範例使用 Faker Python 函式庫產生隨機文字內容,並使用 ReportLab Python 函式庫產生 PDF 檔案。

%pip install faker reportlab

定義輔助函式

定義幾個輔助函式,用於將隨機產生的段落文字儲存為檔案。我們將定義三個輔助函式,每個函式對應一種檔案格式:純文字、PDF 和 CSV。

將段落儲存為純文字檔
from shutil import copyfile
def save_doc_as_text(file_name, save_path, paragraph):
    """將段落文字儲存為純文字檔的輔助函式"""
    tmp_path = f"/local_disk0/tmp/{file_name}"
    volume_path = f"{save_path}/{file_name}"
    print(f"儲存純文字檔於:{tmp_path}")
    txtfile = open(tmp_path, "a")
    txtfile.write(paragraph)
    txtfile.close()
    copyfile(tmp_path, volume_path)

內容解密:

此程式碼定義了一個名為 save_doc_as_text 的輔助函式,用於將段落文字儲存為純文字檔。該函式接受三個引數:file_namesave_pathparagraph。它首先在本地暫存目錄中建立一個暫存檔案,然後將段落文字寫入該檔案。最後,它將暫存檔案複製到指定的儲存路徑。

此程式碼展示瞭如何在 Databricks 中使用 Python 程式碼處理檔案,並利用 copyfile 函式將檔案從暫存目錄複製到目標目錄。這種方法可以確保檔案被正確地儲存和管理。