排解 BigQuery 工作負載管理問題

本文說明如何排解 BigQuery 工作負載管理的常見問題,包括預留項目分配和指派、預留項目設定錯誤、承諾使用合約、運算單元爭用、預留項目監控,以及對話式數據分析對話記錄。

如要查看及管理預留項目、承諾使用合約和管理資源圖表,請確認您具備必要的 Identity and Access Management (IAM) 角色,例如管理專案的 BigQuery 資源檢視者 (roles/bigquery.resourceViewer) 或 BigQuery 資源管理員 (roles/bigquery.resourceAdmin) 角色。詳情請參閱「使用 IAM 控管存取權」。

排解預訂問題

請參考下列資訊,排解預留項目的常見問題,例如新增運算單元時發生錯誤、預留項目未用於 BigQuery 工作,或無法辨識預留項目。

無法增加預留項目大小

嘗試在預留項目中新增更多運算單元時,如果遇到 Failed to allocate slots for reservation in the current system state 或 Failed to update reservation: Failed to allocate slots for reservation 等錯誤,通常是暫時性問題。如要緩解問題,請按照下列步驟操作:

  • 請減少運算單元數量,然後再試一次。
  • 如果嘗試使用較少的運算單元失敗,請等待 15 分鐘,然後重試作業。

如果重試多次並等待 30 分鐘後,仍收到相同的錯誤訊息,請與 Cloud Customer Care 團隊聯絡。

配額不足,無法完成這項要求

如果錯誤訊息顯示 There is insufficient quota to complete this request,表示要求超出專案設定的配額限制。

如要解決這個錯誤,請執行下列任一操作:

  • 在預留項目中新增較少的運算單元,確保要求不會超出配額限制。
  • 請在對應區域申請提高配額。詳情請參閱「要求提高配額」。

BigQuery 未使用預留項目執行工作

在多種情況下,工作可能會使用隨選計價或免費共用運算單元集區,而非您建立的預留項目。

查詢和預留項目位於不同區域

預留項目是區域性資源。查詢會在與查詢中參照的資料表相同的位置執行。

如果資料表的位置與預留項目不符,查詢就不會使用預留項目,而是按照隨選定價模式執行 (或使用免費的共用運算單元集區,執行符合資格的批次載入和匯出工作)。

查詢 BigQuery Omni 資料表

查詢 BigQuery Omni 資料表時,請務必在資料表所在區域建立預留項目,而非共置區域。如果您在共置的 BigQuery 區域建立預留項目,系統會按照隨選定價模式執行查詢。

已建立預留項目,但未指派專案

如要使用預留項目中的運算單元,您必須建立指派作業,將專案、資料夾或組織指派給特定預留項目。確認專案有預留項目的對應指派作業。

工作類型不符

建立指派作業時,請務必選取正確的工作類型,否則工作不會使用預留項目。

舉例來說,如果選取 PIPELINE 做為工作類型,所有查詢工作都會以隨選定價模式執行。將指派類型變更為 QUERY,即可使用預留項目執行查詢工作。

多陳述式查詢

如果您執行多重陳述式查詢,即使子項工作在預留項目下執行,父項工作物件也不會有相關聯的預留項目。

如要確認工作是否確實使用預留項目,請查看子工作的中繼資料。

正在擷取快取結果

查詢工作擷取快取結果時,預留項目欄位會留空,因為 BigQuery 不會執行任何運算,而是直接從臨時資料表擷取結果。

變更資料擷取資料列修改作業

如果您有變更資料擷取 (CDC) 資料表,BigQuery 會在 max_staleness 間隔內,以使用 BACKGROUND 指派類型的背景工作,套用待處理的資料列修改。如果沒有 BACKGROUND 指派作業,這些工作會採用隨選定價模式。建議您為專案建立BACKGROUND指派作業,以免產生非預期的隨選費用。您可以透過工作 ID 中的 queueworker_cdc_background_merge_coalesce 子字串,識別這些工作。

使用外部服務的 BigQuery ML 模型類型

如果專案中找不到 ML_EXTERNAL 工作類型的預留項目指派作業,系統會依據隨選定價模式執行外部模型建立工作。QUERY 工作類型指派適用於標準 BigQuery ML 模型和矩陣分解模型 (需要 Enterprise 或 Enterprise Plus 版預留項目),而外部模型則需要 ML_EXTERNAL 指派。詳情請參閱「將運算單元指派給 BigQuery 工作負載」。

在專案中發現無法辨識的預留項目

BigQuery 擁有預留項目,代表 BigQuery 中特定作業的免費共用運算單元集區。

default-pipeline

根據預設,在 BigQuery 中批次載入或匯出資料時,會使用免費的共用運算單元集區。檢查這些載入或擷取工作時,預留項目欄位會顯示 default-pipeline。

使用共用運算單元集區不會產生費用。如要獲得穩定、可預測的效能,建議您購買 PIPELINE 預留項目。

疑難排解預留項目管理工作問題

建立或更新預留項目時,可能會遇到下列錯誤。

預留項目大小或基準運算單元數量必須是 50 的倍數

錯誤訊息

  • Max reservation size can only be configured in multiples of 50, except when covered by excess commitments.
  • Baseline slots can only be configured in multiples of 50, except when covered by excess commitments.

原因

運算單元一律會自動調度資源至 50 的倍數。BigQuery 會根據實際用量增加運算單元,並以 50 個運算單元為單位遞增。如果沒有承諾使用合約,或合約無法涵蓋增加的數量,則只能以 50 的倍數增加基準和自動調度資源運算單元。

如果 baseline slots 或 max reservation size - baseline slots 不是 50 的倍數 (且未涵蓋在超額運算資源承諾使用合約中),預留項目就無法擴充至大小上限,並會發生這項錯誤。

解決方式

執行下列其中一個步驟:

  • 購買更多承諾使用容量,以因應運算單元增加。
  • 選擇基準和運算單元數量上限 (須為 50 的倍數)。

必須啟用預留項目公平性,才能使用運算單元數量上限

錯誤訊息

  • Cannot use max slots without enabling reservation-based fairness.

原因

您嘗試設定預留項目容量上限 (例如 max_slots 或可預測的預留項目),但必須先在擁有預留項目的專案中,啟用預留項目公平性。

解決方式

您必須在專案中啟用以預留項目為基礎的公平性機制。

疑難排解承諾使用容量問題

本節說明實用的疑難排解步驟,協助您解決 BigQuery 運算資源承諾使用合約的問題。

購買的運算單元尚待處理

運算單元是依據可用容量而定。如果您購買了運算單元承諾使用合約,並透過 BigQuery 進行分配,「狀態」欄會顯示勾號。如果 BigQuery 無法立即分配要求的運算單元,「狀態」欄會持續顯示待處理狀態。您可能必須等待數小時,直到有可用的運算單元釋出。如果需要盡快取得運算單元,請嘗試下列做法:

  1. 刪除待處理的承諾使用合約。
  2. 購買新的承諾使用合約,減少運算單元數量。視容量而定,較小的承諾使用合約可能會立即生效。
  3. 以獨立承諾使用合約的形式購買剩餘運算單元。這些版位在「Status」(狀態) 欄中可能會顯示為待處理,但通常會在幾小時內啟用。
  4. 選用:兩項承諾使用合約都生效後,如果位於相同區域、版本和承諾使用合約方案,可以合併為單一承諾使用合約。

如果運算單元承諾使用合約失敗或需要很長時間才能完成,請考慮暫時使用隨選定價。您可以採用這項解決方案,在未指派給任何預留項目的其他專案中執行重要查詢、將專案指派給 None,或完全移除專案指派。

疑難排解運算單元爭用問題

如果運算單元不足,無法執行所有工作,就可能發生運算單元爭用情況,導致效能問題。如要分析效能降低的原因是工作負載增加,還是環境設定變更,您可以比較兩個系統間隔,涵蓋預留項目和專案。

如要排解運算單元爭用問題,請按照下列步驟和最佳做法操作。

如果嘗試過這些最佳做法後,仍遇到工作效能問題,可以申請支援。

並行工作數量激增

在管理資源圖表中使用詳細檢視畫面,查看工作執行次數是否突然激增,且運算單元用量同時飆升。這類尖峰可能表示有太多工作在爭奪預留項目中的可用運算單元。

最佳做法:建議您最佳化需要大量資源的查詢,或增加預留項目的運算單元容量。如要進一步瞭解如何最佳化查詢效能,請參閱「最佳化查詢運算」。

運算單元用量偏高

請使用詳細資料檢視畫面,檢查工作時間是否增加,尤其是工作超過預留項目容量上限時。運算單元用量持續偏高,可能代表運算單元持續發生爭用情形。

最佳做法:使用工作探索工具的運算單元爭用篩選器,找出並最佳化耗用最多運算單元的查詢。

工作時間長度過長

如果工作完成時間明顯較長,請查看詳細檢視畫面。工作並行率高和運算單元用量激增,可能代表運算單元發生爭用。

最佳做法:暫時停止較不重要的工作,或降低整體工作提交率,藉此隔離重要工作。

運算單元爭用訊息

洞察資料表可能會顯示 There were NUMBER jobs detected with slot_contention in the reservation. 等訊息,指出運算單元爭用問題。請查看工作探索工具,瞭解這些訊息中標記的特定工作詳細資料。

最佳做法:最佳化已識別的查詢,或調整預留項目的運算單元分配。

預留項目監控功能疑難排解

下列各節說明如何解決監控 BigQuery 預留項目和運算單元用量時的常見問題。

運算單元用量指標與 INFORMATION_SCHEMA 不符

如果資源圖表中的運算單元用量指標與 INFORMATION_SCHEMA 資料不一致,請嘗試下列做法:

  • 降低精細程度。將圖表精細程度變更為 1 秒間隔,而非 1 小時間隔。
  • 調整匯總。請務必使用資源圖表和 INFORMATION_SCHEMA 資料一致的匯總方法。舉例來說,如要更準確地反映資源圖表中的尖峰用量,請將指標匯總方式一律變更為 p99 或 p90。

停用閒置運算單元時,系統會顯示借用的運算單元

即使一或多個預留項目已設定 ignore_idle_slots=true,監控圖表仍可能顯示非零的 borrowed_slots 值。這項設定會禁止預留項目「借用」閒置運算單元,但不會禁止預留項目將未使用的運算單元「借給」其他預留項目。

這些借用的運算單元會顯示在下列情況:

  • 借給其他預留項目。如果預留項目設為 ignore_idle_slots=true,則可將未使用的基準運算單元,借給相同管理專案、區域和版本中允許借用閒置運算單元 (ignore_idle_slots=false) 的其他預留項目。如果管理專案、區域和版本中的所有預留項目都設為 ignore_idle_slots=true,則不會共用閒置運算單元。

    舉例來說,假設預留項目 A 有 100 個運算單元,用量為 0,並設有 ignore_idle_slots=true。預留項目 B 位於相同的管理專案、區域和版本,有 100 個運算單元,工作負載需要 150 個運算單元,並設有 ignore_idle_slots=false。預留項目 B 可從預留項目 A 借用 50 個閒置運算單元,滿足自身需求。發生這種情況時,監控圖表會回報預留項目 A 有 50 個lent_slots,預留項目 B 有 50 個borrowed_slots。

  • 用量超過容量。如果預留項目的運算單元用量暫時超過容量 (基準 + 自動調度運算單元),監控圖表會將這項差異顯示為 borrowed_slots。即使預留項目含有 ignore_idle_slots=true,也可能發生這種情況。

運算單元用量有時可能會超過基準和調度運算單元的總和。如果運算單元用量超過基準加上擴充運算單元,您不需支付費用。

預留項目用盡前,就會出現借用的運算單元

監控資訊主頁會使用樣本資料,可能無法準確反映取樣間隔內運算單元用量的精確時間。

如要更準確地分析運算單元用量,請查詢與閒置運算單元相關的資料欄,例如 INFORMATION_SCHEMA.RESERVATIONS_TIMELINE 檢視表中的 borrowed_slots 和 lent_slots 資料欄。

排解對話記錄問題

請參考下列資訊,排解 BigQuery 對話式數據分析對話記錄的常見問題。由於記錄錯誤不會導致對話回合失敗,也不會回報至 Chat 或 Cloud Logging,因此目的地資料表空白或遺失,是設定或權限問題的主要信號。

記錄資料表遺失或空白

如果對話結束後,目的地資料表未建立或仍為空白,請檢查下列可能原因:

  • 對話記錄不會儲存或發布。在 BigQuery Studio 中重新整理頁面,重新開啟代理設定,確認「Enable conversation logging」(啟用對話記錄) 已開啟、目的地資料集和資料表已設定,且變更已發布。

  • 目的地資料集遺失或位於其他專案。確認目的地資料集已存在於資料代理程式所在的專案中。您可以執行 bq show PROJECT_ID:LOG_DATASET,確認資料集是否存在。將 PROJECT_ID 替換為包含資料代理的專案 ID,並將 LOG_DATASET 替換為目的地資料集的 ID。服務代理會在第一個記錄的回合建立記錄資料表,但不會建立資料集。

  • 缺少服務代理或 CMEK 權限。確認對話式數據分析 API 服務代理 (service-PROJECT_NUMBER@gcp-sa-geminidataanalytics.iam.gserviceaccount.com,使用代理專案編號而非專案 ID) 具備記錄資料集的 BigQuery 資料編輯者 (roles/bigquery.dataEditor) 角色。如果資料集使用客戶自行管理的 Cloud KMS 金鑰 (CMEK),請確認 BigQuery 加密服務帳戶 (bq-PROJECT_NUMBER@bigquery-encryption.iam.gserviceaccount.com) 具備金鑰的 roles/cloudkms.cryptoKeyEncrypterDecrypter 角色。

  • 不支援的對話介面或代理設定。BigQuery Studio「預覽」窗格中的對話不會記錄。請從已發布代理的主要即時通訊畫面進行測試。如果代理使用搜尋範圍而非特定 BigQuery 資料表、將屬性圖譜設為知識來源,或未宣告任何 BigQuery 資料表,則不會記錄。詳情請參閱「限制」一節。

  • 知識來源資料表會使用存取權政策。如果任何知識來源資料表使用資料列層級存取權政策、資料欄層級安全性 (政策標記) 或動態資料遮蓋,系統就不會記錄對話。

  • 現有目的地資料表發生結構定義衝突。如果您將現有資料表設為目的地,且資料欄與對話記錄結構定義資料欄同名,但類型或模式不同,BigQuery 就不會將資料列寫入該資料表。

資料列通常會在回合結束後幾秒內顯示。如果等待幾分鐘後仍未顯示資料列,請重新整理資料集。

部分使用者的對話未記錄

原因

在每次對話前,隱私權檢查會使用對話使用者的憑證,驗證代理的知識來源資料表沒有資料列層級安全性、資料欄層級安全性或資料遮蓋政策。如果使用者沒有執行這項檢查的權限,系統就不會記錄他們的對話。

解決方式

將知識來源資料表的 BigQuery 資料檢視者 (roles/bigquery.dataViewer) 角色,以及執行查詢的專案 BigQuery 工作使用者 (roles/bigquery.jobUser) 角色,授予所有對話使用者,或授予具備知識來源資料表 bigquery.tables.get 和 bigquery.rowAccessPolicies.list 權限的自訂角色。

儲存代理時失敗,並發生 INVALID_ARGUMENT 錯誤

錯誤訊息

  • The BigQuery Agent Analytics table must be in the same project as the agent (agent project: ..., table project: ...).

  • BigQuery Agent Analytics can only be enabled on agents whose datasource is BigQuery. Remove bigquery_agent_analytics_enabled and bigquery_agent_analytics_table, or point the agent at a BigQuery datasource.

原因

目的地資料集與資料代理位於不同專案,或代理的資料來源不是 BigQuery。

解決方式

請在資料代理所在的專案中,選取現有的目的地資料集,或使用 BigQuery 資料來源設定資料代理。

服務代理不存在,因此無法授予資料集存取權

錯誤訊息

  • Service account service-PROJECT_NUMBER@gcp-sa-geminidataanalytics... does not exist

原因

專案尚未佈建 Conversational Analytics API 服務代理。

解決方式

執行下列其中一個步驟:

  • 請先在代理程式上設定記錄檔目的地,然後再次授予角色。

  • 執行下列指令,佈建服務身分:

    gcloud beta services identity create \
        --service=geminidataanalytics.googleapis.com \
        --project=PROJECT_ID

    將 PROJECT_ID 替換為資料代理程式所在專案的 ID。

BigQuery Studio 無法使用對話記錄設定

原因

您目前查看的是資料代理的「已發布」版本,其設定為唯讀,或未選取特定 BigQuery 資料表做為知識來源。

解決方式

將檢視畫面選取器切換至「Draft」(草稿),確認已選取特定 BigQuery 資料表做為知識來源,更新對話記錄設定,然後發布代理。

後續步驟