手動將查詢最佳化器與watsonx.data元儲存同步
關於此作業
為了提供最佳化的查詢,Query Optimizer 會拉取關於資料表定義的資料,以及 Hive 和 Iceberg 統計資料,與 IBM® watsonx.data 中的 MDS 同步。 您可以選擇特定的 Hive 和 Iceberg 資料表,必須提供給 Query Optimizer。 建議為主鍵和外鍵產生 Hive 和 Iceberg 統計和標示列,以獲得最佳結果。
啟動查詢優化器會自動同步連接到Presto (C++) 引擎的目錄的元資料。 但是,如果出現以下情況,您將需要執行以下步驟:
- 部署期間無法存取或損壞的目錄或架構的元資料遺失。
- 對錶進行了重大更改。
- 在初始同步操作後引入新表。
- 間歇性問題是在啟動後的自動同步過程中阻止表同步。
開始之前
若要從 watsonx.data 同步處理資料表,需要下列項目:
現在可以使用增強功能 「從優化器儀表板管理統計更新」 來執行本主題中的說明,該功能可實現跨多個目錄的高階查詢效能增強和最佳化功能。
-
依照 驗證 watsonx.data 中的表同步 中的程序驗證所有預期表是否均已同步。
-
在 watsonx.data 中找出您需要用於 Query Optimizer 的 Hive 和 Iceberg 表清單。
-
在 Hive 和 Iceberg 表中識別列為主鍵和外鍵。
-
ANALYZE在 Presto (C++) 中產生 Hive 和 Iceberg 表格,以產生 Hive 和 Iceberg 統計資料。 -
作為一項安全性增強功能,僅允許具有管理員權限的使用者執行
ExecuteWxdQueryOptimizer命令。 -
如果會話參數
is_query_rewriter_plugin_enabled設定為false,將無法執行ExecuteWxdQueryOptimizer指令。
程序
-
登入 watsonx.data。
-
前往查詢工作區。
-
跑過
ANALYZE命令來自watsonx.data您想要同步以產生統計資料的資料表的 Web 控制台(統計資料是行數、列名、data_size、行計數等)。ANALYZE catalog_name.schema_name.table_name ; -
執行下列指令,在查詢最佳化器中手動註冊目錄的元儲存屬性,使用傳統的元儲存類型
watsonx-data,適用於 Hive 和 Iceberg 目錄:ExecuteWxdQueryOptimizer 'CALL SYSHADOOP.REGISTER_EXT_METASTORE('<CATALOG_NAME>', '<ARGUMENTS>', ?, ?)';a. 對於 watsonx.data 企業版,請同時對 Hive 和 Iceberg
watsonx-data目錄使用傳統元數據儲存庫類型:ExecuteWxdQueryOptimizer 'CALL SYSHADOOP.REGISTER_EXT_METASTORE('<CATALOG_NAME>','type=watsonx-data,uri=thrift://<THRIFT_URL>,use.SSL=true,auth.mode=PLAIN,ssl.cert=/secrets/external/ibm-lh-tls-secret/ca.crt,auth.plain.credentials=<USERNAME>:<PASSWORD>', ?, ?)例如:
ExecuteWxdQueryOptimizer 'CALL SYSHADOOP.REGISTER_EXT_METASTORE('iceberg_data','type=watsonx-data,uri=thrift://ibm-lh-lakehouse-mds-thrift-svc.zen.svc.cluster.local:8380,use.SSL=true,auth.mode=PLAIN,ssl.cert=/secrets/external/ibm-lh-tls-secret/ca.crt,auth.plain.credentials=admin:password', ?, ?)';-
type- 您要連線的 metastore 類型。 支援的值為:watsonx-data。 -
watsonx.data <CATALOG_NAME>- 如 Infrastructure Manager 頁面所示 (區分大小寫)。 -
<THRIFT_URL>- 如從 Infrastructure Manager 頁面取得 (按一下目錄)。 -
auth.plain.credentials中的 MDS 認證 (<Username>和<Password>)- 必須在 watsonx.data 側建立。 參閱「連接至 watsonx.data」於 OpenShift。 如果元存储要求 PLAIN 身份验证,则必须以username:password或ibmlhapikey_<username>:apikey的格式指定凭据。 密碼會安全地儲存在軟體的 keystore 中。 -
auth.mode- 如果元端程式庫需要驗證,請指出要使用的驗證模式。 auth.mode 必須設定為 PLAIN -
use.SSL- 如果元端程式庫需要 SSL 連線,則必須為 true。 -
<MDS certificate file path>- 此文件必須作為證書存放於 db2u 容器中,用以驗證 SSL 連線。 若 SSL 連線是透過知名的 CA( DigiCert 如或 VeriSign )所簽發的憑證建立,則無需傳遞憑證。 預設情況下,MDS 憑證可在查詢優化器的路徑 /secrets/external/ibm-lh-tls-secret/ca.crt 下取得。-
執行下列指令以識別 db2u Query Optimizer head pod (OPT_POD)。
oc get pod | grep oaas-db2u -
執行以下指令以產生憑證,請將 <OPT_POD> 和 <OPT_PAD> 的值替換為實際參數:
. oc exec -it <OPT_POD> -c db2u -- bash -c "echo QUIT | openssl s_client -showcerts -connect <Metastore Thrift endpoint> | awk '/-----BEGIN CERTIFICATE-----/ {p=1}; p; /-----END CERTIFICATE-----/ {p=0}' > /tmp/mds.pem"
-
b. 對於 watsonx.data 精簡版 Hive,冰山表格採用獨立的元儲存伺服器類型進行管理。 根據您的應用程式需求,您必須為 Metastore Hive 伺服器、Iceberg 伺服器或兩者同時進行註冊。
-
在 watsonx.data 精簡版中註冊目錄 Hive:
ExecuteWxdQueryOptimizer 'CALL SYSHADOOP.REGISTER_EXT_METASTORE('<CATALOG_NAME>','type=watsonx-data-hive,uri=https://<THRIFT_URL>/mds/thrift,use.SSL=true,auth.mode=PLAIN,ssl.cert=/secrets/external/ibm-lh-tls-secret/ca.crt,auth.plain.credentials=<USERNAME>:<PASSWORD>', ?, ?)';例如:
ExecuteWxdQueryOptimizer 'CALL SYSHADOOP.REGISTER_EXT_METASTORE('iceberg_data','type=watsonx-data,uri=thrift://ibm-lh-lakehouse-mds-thrift-svc.zen.svc.cluster.local:8380,use.SSL=true,auth.mode=PLAIN,ssl.cert=/secrets/external/ibm-lh-tls-secret/ca.crt,auth.plain.credentials=admin:password', ?, ?)';type- 您要連線的 metastore 類型。 對於管理 Hive 表格的元資料儲存庫,其值為:watsonx-data-hive。watsonx.data <CATALOG_NAME>- 如 Infrastructure Manager 頁面所示 (區分大小寫)。<THRIFT_URL>- MDS watsonx.data 節省服務器的 URI。 它必須以https://. 開頭。auth.plain.credentials中的 MDS 認證 (<Username>和<Password>)- 必須在 watsonx.data 側建立。 參見「連接至」watsonx.data 於 OpenShift。 若元儲存庫需要 PLAIN 驗證,憑證必須以 或username:password格式ibmlhapikey_<username>:apikey指定。 密碼會安全地儲存在軟體的 keystore 中。auth.mode- 如果元端程式庫需要驗證,請指出要使用的驗證模式。 必須auth.mode設定為PLAIN。use.SSL- 如果元端程式庫需要 SSL 連線,則必須為 true。<MDS certificate file path>- 此文件必須作為證書存放於 db2u 容器中,用以驗證 SSL 連線。 若 SSL 連線是透過知名 CA( DigiCert 如或 VeriSign )所簽發的憑證建立,則無需傳遞憑證。 預設情況下,MDS 證書可在查詢優化器的路徑 /secrets/external/ibm-lh-tls-secret/ca.crt 下取得。
-
從 watsonx.data 精簡版註冊冰山目錄:
ExecuteWxdQueryOptimizer 'CALL SYSHADOOP.REGISTER_EXT_METASTORE('<CATALOG_NAME>','type=iceberg-rest,catalog.name=<CATALOG_NAME>,uri=https://<REST_URL>/mds/iceberg,auth.mode=basic,ssl.cert=/secrets/external/ibm-lh-tls-secret/ca.crt,auth.plain.credentials=<USERNAME>:<PASSWORD>', ?, ?)';例如:
ExecuteWxdQueryOptimizer 'CALL SYSHADOOP.REGISTER_EXT_METASTORE('iceberg_data','type=iceberg-rest,catalog.name=iceberg_data,uri=https://ibm-lh-lakehouse-mds-rest-svc.zen.svc.cluster.local:8180/mds/iceberg,auth.mode=basic,ssl.cert=/secrets/external/ibm-lh-tls-secret/ca.crt,auth.plain.credentials=admin:password', ?, ?)';type- 您要連線的 metastore 類型。 對於管理 Iceberg 表格的元數據儲存庫,其值為:iceberg-rest。watsonx.data <CATALOG_NAME>- 如 Infrastructure Manager 頁面所示 (區分大小寫)。<THRIFT_URL>- 冰山 watsonx.data REST MDS 伺服器的 URI。 URI 必須以https://開頭,並包含 REST API 目錄的基礎路徑。 對於 watsonx.data,其基礎路徑為/mds/iceberg。auth.plain.credentials中的 MDS 認證 (<Username>和<Password>)- 必須在 watsonx.data 側建立。 參見「連接至」watsonx.data 於 OpenShift。 若元儲存庫需要 PLAIN 驗證,憑證必須以 或username:password格式ibmlhapikey_<username>:apikey指定。 密碼會安全地儲存在軟體的 keystore 中。auth.mode- 如果元端程式庫需要驗證,請指出要使用的驗證模式。 必須auth.mode設定為PLAIN。use.SSL- 如果元端程式庫需要 SSL 連線,則必須為 true。<MDS certificate file path>- 此文件必須作為證書存放於 db2u 容器中,用以驗證 SSL 連線。 若 SSL 連線是透過知名 CA( DigiCert 如或 VeriSign )所簽發的憑證建立,則無需傳遞憑證。 預設情況下,MDS 證書可在查詢優化器的路徑 /secrets/external/ibm-lh-tls-secret/ca.crt 下取得。
-
-
執行以下命令進行註冊watsonx.data目錄與查詢最佳化器:
ExecuteWxdQueryOptimizer 'CALL SYSHADOOP.REGISTER_EXT_METASTORE('<CATALOG_NAME>','type=watsonx-data,uri=thrift://<Metastore_Thrift_endpoint>,use.SSL=true,auth.mode=PLAIN,auth.plain.credentials=<Username>:<apikey>', ?, ?)';<CATALOG_NAME>- 如 Infrastructure Manager 頁面所示 (區分大小寫)。<Metastore_Thrift_endpoint>- 如從 Infrastructure Manager 頁面取得 (按一下目錄)。- MDS 認證 (
<Username>:<apikey>)- 必須在 watsonx.data 上建立。 請參閱 IBM Cloud 或 Amazon Web Services 連線至 watsonx.data。
將目錄註冊至查詢優化器後,即可 watsonx.data 將資料表同步至查詢優化器,從而實現查詢優化。 這需要為每個目錄運行一次。
-
執行以下命令來同步目錄中每個架構的表:
ExecuteWxdQueryOptimizer 'CALL SYSHADOOP.EXT_METASTORE_SYNC('<CATALOG_NAME>', '<SCHEMA_NAME>', '.*', '<SYNC MODE>', 'CONTINUE', 'OAAS')';<CATALOG_NAME>:要同步的表所屬目錄的名稱。<SCHEMA_NAME>:要同步的表所屬架構的名稱。<SYNC MODE>:SKIP是一種同步模式,指示應跳過已定義的物件。REPLACE是另一種同步模式,用於更新物件(如果自上次同步以來物件已被修改)。CONTINUE:錯誤已記錄,但如果要匯入多個表,處理會繼續。
同步完成後,輸出將顯示已同步表的清單。 同步表的總數必須是目錄或架構中表格數量的兩倍。 這是因為,每個表都同步兩次。 從外部元儲存庫到本地元儲存庫,再從本地元儲存庫到目錄 Db2。
請參照 《驗證表格同步》 中的步驟,於數分鐘內確認同步操作是否完成 watsonx.data。
-
識別目錄和模式的列表watsonx.data你需要的查詢最佳化器。
提供 SQL 檔案來定義約束查詢最佳化器使用。 在 SQL 檔案中,識別適用於資料集中每個資料表的主鍵、外鍵和非空白列。
例如,如果您有以下三個帶有給定列的表,
僱員 (EmployeeID,FirstName,LastName,部門和薪資),部門(DepartmentID和DepartmentName),和EmployeeDepartmentMapping(MappingID,EmployeeID,和DepartmentI)。
跑過
ALTER表命令定義約束:-- NOT NULL ExecuteWxdQueryOptimizer 'ALTER TABLE "catalog_name".schema_name.Employees ALTER COLUMN FirstName SET NOT NULL ALTER COLUMN LasttName SET NOT NULL ALTER COLUMN Salary SET NOT NULL ALTER COLUMN EmployeeID SET NOT NULL'; ExecuteWxdQueryOptimizer 'ALTER TABLE "catalog_name".schema_name.Departments ALTER COLUMN DepartmentName SET NOT NULL ALTER COLUMN DepartmentID SET NOT NULL '; ExecuteWxdQueryOptimizer 'ALTER TABLE "catalog_name".schema_name.EmployeeDepartmentMapping ALTER COLUMN MappingID SET NOT NULL '; -- PRIMARY KEY ExecuteWxdQueryOptimizer 'ALTER TABLE "catalog_name".schema_name.Employees ADD PRIMARY KEY (EmployeeID) NOT ENFORCED'; ExecuteWxdQueryOptimizer 'ALTER TABLE "catalog_name".schema_name.Departments ADD PRIMARY KEY (DepartmentID) NOT ENFORCED'; ExecuteWxdQueryOptimizer 'ALTER TABLE "catalog_name".schema_name.EmployeeDepartmentMapping ADD PRIMARY KEY (MappingID) NOT ENFORCED'; -- FOREIGN KEY ExecuteWxdQueryOptimizer 'ALTER TABLE "catalog_name".schema_name.EmployeeDepartmentMapping ADD FOREIGN KEY (EmployeeID) REFERENCES "catalog_name".schema_name.Employees(EmployeeID) NOT ENFORCED'; ExecuteWxdQueryOptimizer 'ALTER TABLE "catalog_name".schema_name.EmployeeDepartmentMapping ADD FOREIGN KEY (DepartmentID) REFERENCES "catalog_name".schema_name.Departments(DepartmentID) NOT ENFORCED';