排解 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 無法立即分配要求的運算單元,「狀態」欄會持續顯示待處理狀態。您可能必須等待數小時,直到有可用的運算單元釋出。如果需要盡快取得運算單元,請嘗試下列做法:
- 刪除待處理的承諾使用合約。
- 購買新的承諾使用合約,減少運算單元數量。視容量而定,較小的承諾使用合約可能會立即生效。
- 以獨立承諾使用合約的形式購買剩餘運算單元。這些版位在「Status」(狀態) 欄中可能會顯示為待處理,但通常會在幾小時內啟用。
- 選用:兩項承諾使用合約都生效後,如果位於相同區域、版本和承諾使用合約方案,可以合併為單一承諾使用合約。
如果運算單元承諾使用合約失敗或需要很長時間才能完成,請考慮暫時使用隨選定價。您可以採用這項解決方案,在未指派給任何預留項目的其他專案中執行重要查詢、將專案指派給 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 資料表做為知識來源,更新對話記錄設定,然後發布代理。
後續步驟
- 進一步瞭解如何使用預留項目管理工作負載。
- 瞭解如何管理工作負載預留項目。
- 瞭解如何購買及管理運算單元承諾使用合約。
- 瞭解如何監控預留項目和使用管理資源圖表。
- 進一步瞭解對話式數據分析的對話記錄功能。
- 探索其他 BigQuery 疑難排解資源。