使用查詢同盟時,查詢會使用 JDBC API 向下推送至外部資料庫。 查詢會在 Databricks 和使用遠端計算中執行。 查詢聯盟用於像 MySQL、PostgreSQL、Redshift、Teradata 等來源。
為什麼要使用 Lakehouse 聯盟?
Lakehouse 強調數據的集中儲存,以減少數據冗餘與隔離。 您的組織在生產環境中可能有許多數據系統,而且您可能會想要查詢連線系統中的數據,原因有很多:
- 隨選報告。
- 概念驗證工作。
- 新 ETL 管線或報表的初步探討階段。
- 在漸進移轉期間支援工作負載。
在這些案例中,查詢同盟可讓您更快速地深入解析,因為您可以就地查詢資料,並避免複雜且耗時的 ETL 處理。
查詢聯邦適用於以下用例:
- 你不想把資料匯入 Azure Databricks。
- 您希望查詢利用外部資料庫系統中的計算。
- 您想要 Unity 目錄介面和數據控管的優點,包括細部訪問控制、數據譜系和搜尋。
查詢同盟與 Lakeflow Connect
查詢同盟可讓您在不移動數據的情況下查詢外部數據源。 Databricks 建議使用 Lakeflow Connect 管理式連接器進行資料擷取,因為它們能擴展以容納大量資料量與更低的查詢延遲。 不過,您可能想要查詢資料而不移動數據。 當您在選擇管理的資料擷取連接器和查詢聯邦時,若需要進行即席報告或在 ETL 管線上進行概念驗證工作,請選擇查詢聯邦。
如果您的數據來源支持的話,基於查詢的擷取連接器 是 Lakeflow Connect 中的 CDC 連接器的輕量替代品。 它們根據排程直接查詢來源,使用游標欄位,無需閘道器或暫存儲存。 當你需要定期資料擷取但沒有 CDC 基礎設施時,可以使用基於查詢的擷取連接器。
查詢同盟設定概觀
若要使用 Lakehouse Federation 讓數據集可供只讀查詢,請建立下列項目:
- 連接是一個在 Unity Catalog 中可設為安全的物件,指定存取外部資料庫系統的路徑和憑證。
- 外部目錄,是 Unity 目錄中可保護的物件,能鏡像外部資料系統中的資料庫,讓你能在 Azure Databricks 工作空間中對該資料系統執行唯讀查詢,並透過 Unity 目錄管理存取。
支持的數據源
查詢同盟支援下列來源的連線:
- MySQL
- PostgreSQL
- Teradata
- Oracle
- Amazon Redshift
- Salesforce 資料 360
- Snowflake
- Microsoft SQL 伺服器
- Azure Synapse (SQL Data Warehouse)
- 谷歌大查詢
- Databricks
連線需求
工作區需求:
- 已為 Unity Catalog 啟用了工作區。 2023 年 11 月 9 日之後建立的工作區將自動啟用 Unity Catalog,包括自動進行 metastore 配置。 除非你的工作區早於自動啟用且還沒啟用 Unity Catalog,否則你不需要手動建立元商店。 請參閱 自動啟用 Unity 目錄。
計算需求:
- 您的計算資源與目標資料庫系統之間的網路連接能力。 請參閱 Lakehouse Federation 的網路建議。
- Azure Databricks計算必須使用 Databricks Runtime 13.3 LTS 或更高版本,以及 Standard 或 Dedicated 存取模式。
- SQL 倉儲必須是專業或無伺服器,且必須使用 2023.40 或更新版本。
需要的權限:
- 若要建立連線,您必須是中繼存放區系統管理員,或是具有附加至工作區之 Unity 目錄中繼存放區
CREATE CONNECTION許可權的使用者。 在自動啟用 Unity 目錄的工作區中,工作區管理員預設擁有此CREATE CONNECTION權限。 - 若要建立外來目錄,您必須具有中繼存放區的
CREATE CATALOG許可權,並且必須是連線的擁有者或具有該連線的CREATE FOREIGN CATALOG特權。 在自動啟用 Unity 目錄的工作區中,工作區管理員預設擁有此CREATE CATALOG權限。
在後續每個以任務為基礎的章節中,會指定額外的權限要求。
建立連線
連接會指定用來存取外部資料庫系統的路徑和認證。 要建立連線,您可以使用目錄總管或Azure Databricks筆記本中的 CREATE CONNECTION SQL 指令,或 Databricks SQL 查詢編輯器。
Note
您也可以使用 Databricks REST API 或 Databricks CLI 來建立連線。 請參閱 POST /api/2.1/unity-catalog/connections 和 Unity Catalog 命令。
需要的許可權:中繼存放區系統管理員或擁有CREATE CONNECTION許可權的使用者。
目錄檢視器
在你的Azure Databricks工作區,點選
Catalog。
在「目錄」窗格頂端,按一下「
「新增」圖示,然後從功能表中選取「建立連線」。輸入使用者易記的 [連線名稱]。
選取 [連線類型] (資料庫提供者,例如 MySQL 或 PostgreSQL)。
(選擇性) 新增註解。
按 [下一步]。
輸入連線屬性(例如主機資訊、路徑和存取認證)。
每個連接類型都需要不同的連線資訊。 請參閱連線類型的文章,它列在左側的目錄中。
點選 「建立連線」。
輸入外國目錄的名稱。
(選擇性)按兩下 [ 測試連線 ] 以確認其運作正常。
點選 「建立目錄」。
選取使用者可以存取您所建立目錄的工作區。 您可以選取 [所有工作區都有存取權],或點擊 [指派給工作區],選取工作區,然後點擊 [指派]。
將 擁有者 變更為可以管理目錄中所有物件存取權的人。 在文字框中開始輸入對象,然後在搜尋結果中點擊該對象。
對目錄授予許可權。 請點擊授與:
- 指定可存取目錄中對象的 主體 。 在文字框中開始輸入對象,然後在搜尋結果中點擊該對象。
- 選取 權限預設,以授與每個主體。 根據預設,所有帳戶用戶都會被授與
BROWSE。- 從下拉功能表中選取 [數據讀取器],以授與目錄中物件
read許可權。 - 從下拉功能表中選取 資料編輯器,以授予
read和modify目錄中對象的權限。 - 手動選取要授與的許可權。
- 從下拉功能表中選取 [數據讀取器],以授與目錄中物件
- 請按一下 授權。
- 按 [下一步]。
- 在 [元數據] 頁面上,指定標籤的鍵-值配對。 如需詳細資訊,請參閱在 Unity Catalog 中將標籤套用到可保護的物件。
- (選擇性) 新增註解。
- 點選 [儲存]。
SQL
在筆記本或 SQL 查詢編輯器中執行下列命令。 此範例適用於 PostgreSQL 資料庫的連線。 選項會因連線類型而有所不同。 請參閱連線類型的文章,它列在左側的目錄中。
CREATE CONNECTION <connection-name> TYPE postgresql
OPTIONS (
host '<hostname>',
port '<port>',
user '<user>',
password '<password>'
);
我們建議您對像憑證這類敏感值使用Azure Databricks secrets,而非明文字串。 例如:
CREATE CONNECTION <connection-name> TYPE postgresql
OPTIONS (
host '<hostname>',
port '<port>',
user secret ('<secret-scope>','<secret-key-user>'),
password secret ('<secret-scope>','<secret-key-password>')
)
如需設定祕密的相關資訊,請參閱祕密管理。
如需管理現有連線的資訊,請參閱 Lakehouse 聯邦的連線管理。
建立外部目錄
Note
如果您使用 UI 來建立與數據來源的連線,則會包括外來目錄的建立,而且您可以略過此步驟。
外部目錄會鏡像外部資料系統中的資料庫,讓你能使用 Azure Databricks 和 Unity Catalog 查詢和管理該資料庫的資料存取。 若要建立外部目錄,您可以使用已定義的數據源連線。
要建立外國目錄,您可以使用目錄探索器或Azure Databricks筆記本中的 CREATE FOREIGN CATALOG SQL 指令,或 SQL 查詢編輯器。 您也可以使用 Unity 目錄 API。 請參見Azure Databricks參考文件。
外部目錄元數據會在每次與目錄互動時同步到 Unity Catalog。 如需 Unity 目錄與數據來源之間的資料類型對應,請查看每個數據源檔的 [資料類型對應 ] 區段。
必要權限:對中繼存放區的 CREATE CATALOG 權限,以及連線的所有權或對連線的 CREATE FOREIGN CATALOG 特權。
目錄檢視器
在Azure Databricks工作區中,點擊
Catalog 以開啟目錄總管。
在「目錄」窗格頂端,按一下「
「新增資料」圖示,然後從功能表中選取「建立目錄」。或者,從 [ 快速存取] 頁面按兩下 [ 目錄] 按鈕,然後按下 [ 建立目錄 ] 按鈕。
請按照建立目錄中的指示來建立外部目錄。
SQL
在筆記本或 SQL 查詢編輯器中執行下列 SQL 命令。 括弧中的項目是選擇性的。 替換占位符值:
-
<catalog-name>:Azure Databricks 目錄的名稱。 -
<connection-name>:指定數據源、路徑和存取認證的 連接物件 。 -
<database-name>:你想在Azure Databricks鏡像成目錄的資料庫名稱。 MySQL 不需要,其使用兩層命名空間。 -
<external-catalog-name>:Databricks-to-Databricks 僅限:您所鏡像的外部 Databricks 工作區中的目錄名稱。 請參閱 建立外部目錄。
CREATE FOREIGN CATALOG [IF NOT EXISTS] <catalog-name> USING CONNECTION <connection-name>
OPTIONS (database '<database-name>');
如需管理及使用外部目錄的詳細資訊,請參閱 管理及使用外部目錄。
刷新元資料
Unity 目錄會在查詢時自動重新整理外部資料表的中繼資料。 如果外部目錄的結構描述變更,Unity 目錄會在查詢執行時擷取最新的中繼資料。 這種行為能讓結構保持最新,對大多數工作負載來說是最佳的。
不過,Databricks 建議在下列情況下手動更新中繼資料:
- 為了維持被外部引擎存取的外部資料表的一致性。 繞過 Databricks 執行環境的路徑不會觸發自動刷新,導致元資料過時。
- 為了改善在查詢執行期間避免重新整理中繼資料的工作負載效能。 積極更新中繼資料可讓查詢使用快取的中繼資料更快執行。 這種方法在建立外國目錄後特別有用,因為第一次查詢會觸發完整刷新。
使用 Lakeflow Jobs 自動化元資料刷新
使用 Lakeflow 作業搭配 SQL 指令,排程進行定期的元資料更新。 例如:
-- Refresh an entire catalog
> REFRESH FOREIGN CATALOG some_catalog;
-- Refresh a specific schema
> REFRESH FOREIGN SCHEMA some_catalog.some_schema;
-- Refresh a specific table
> REFRESH FOREIGN TABLE some_catalog.some_schema.some_table;
將工作設定為定期執行,視您預期外部結構描述變更的頻率而定。
使用具體化檢視從外部數據表載入數據
當您建立具體化檢視時,Databricks 建議使用查詢同盟載入外部數據。 請參閱 具體化檢視。
當您使用查詢同盟時,用戶可以參考同盟數據,如下所示:
CREATE MATERIALIZED VIEW xyz AS SELECT * FROM federated_catalog.federated_schema.federated_table;
檢視系統產生的同盟查詢
查詢同盟會將 Databricks SQL 語句轉譯成可向下推送至同盟數據源的語句。 若要檢視產生的 SQL 語句,請按兩下 查詢設定檔圖表檢視上的外部資料源掃描節點,或執行 EXPLAIN FORMATTED SQL 語句。 有關涵蓋範圍,請參閱每個數據來源文件中支援的下推一節。
Limitations
- 查詢是唯讀的。 唯一的例外狀況是使用 Lakehouse 同盟來同盟工作區的舊版 Hive 中繼存放區 (目錄同盟)。 該案例中的外部數據表是可寫入的。 請參閱 在同盟Hive中繼存放區中寫入外部目錄的意義為何?。
- 連線的節流是使用 Databricks SQL 並發查詢限制來決定。 每個連線不受倉庫之間的任何限制。 請參閱排程和自動擴展邏輯。
- Databricks 的查詢快取(結果快取與磁碟快取)不支援聯邦查詢。 這表示該
use_cached_result參數不適用於對聯邦來源的查詢。 - 不支援在 Unity 目錄中具有無效名稱的數據表和架構,而且在建立外部目錄時會由 Unity 目錄忽略。 請參閱 限制中的命名規則和限制清單。
- 數據表名稱和架構名稱會轉換成 Unity 目錄中的小寫。 如果這會導致名稱衝突,Databricks 無法保證哪一個對象會匯入外部目錄。
- 針對所參考的每個外部數據表,Databricks 會排程遠端系統中的子查詢,以從該數據表傳回數據子集,然後透過單一數據流將結果傳回至一個 Databricks 執行程式工作。 如果結果集太大,執行程式可能會用盡記憶體。
- 專用存取模式(先前為單一使用者存取模式)僅適用於擁有連線的使用者。
- Lakehouse Federation 無法將帶有大小寫區分識別碼的外來表 Azure Synapse 連線或 Redshift 連線聯邦化。
資源配額
Azure Databricks 會對所有 Unity Catalog 可安全物件強制執行資源配額。 這些配額列在資源限制中。 外部目錄及其包含的所有物件都會包含在總配額使用量中。
如果您預期會超過這些資源限制,請聯絡您的 Azure Databricks 帳戶團隊。
您可以使用 Unity 目錄資源配額 API 來監視配額使用量。 請參閱 監控 Unity Catalog 資源配額的使用情況。