排解 BigQuery 訂閱問題

本頁面提供一些常見的 BigQuery 訂閱疑難排解提示。

檢查 BigQuery 訂閱項目的狀態

如要查看訂閱狀態,請執行下列步驟:

  1. 在 Google Cloud 控制台中,前往 Pub/Sub 訂閱頁面。

    前往「訂閱項目」頁面

  2. 查看 BigQuery 訂閱項目的「狀態」圖示。

    如果圖示是綠色勾號,表示訂閱項目運作正常。

    如果圖示為紅色驚嘆號,表示訂閱處於錯誤狀態。

  3. 按一下 BigQuery 訂閱項目。

    系統會開啟訂閱詳細資料頁面。

  4. 請查看「訂閱狀態」,瞭解錯誤訊息。

  5. 請根據錯誤訊息,前往本頁的相關章節排解問題。

問題解決後,訂閱項目最終會恢復正常狀態。

無法建立或更新訂閱項目

以下是建立或更新 BigQuery 訂閱時可能遇到的常見問題。

找不到資料表錯誤

如果您在建立或更新訂閱項目工作流程中指定的資料表不存在,工作流程會傳回「找不到資料表」錯誤。在 Google Cloud 主控台中,訊息會類似以下內容:

The BigQuery table or dataset specified cannot be found.

如要解決這個問題,請先建立資料表,並確認您可以檢查其狀態,再將資料表與 BigQuery 訂閱項目搭配使用。

結構定義不符錯誤

如果資料表和主題的結構定義不相容,建立或更新訂閱工作流程會傳回結構定義不相符的錯誤。在 Google Cloud 主控台中,訊息會類似以下內容:

Incompatible schema type for field project_ids: expected INT64, got STRING

指定的錯誤訊息是指 project_ids 欄位的結構定義不相符。視你的架構不相符類型而定,你可能會看到不同的錯誤訊息。

如要解決這個問題,請檢查結構定義對應是否相容

服務帳戶錯誤

如果您尚未為 Pub/Sub 服務帳戶設定正確的權限,建立或更新訂閱項目的工作流程就會傳回錯誤。在 Google Cloud 主控台中,訊息會類似以下內容:

Service account service-1234234234@gcp-sa-pubsub.iam.gserviceaccount.com
is missing permissions required to write to the BigQuery table:
bigquery.tables.get, bigquery.tables.updateData.

如要解決這個問題,請檢查服務帳戶是否具備正確的權限

訂閱狀態顯示紅色驚嘆號

如果您在建立訂閱項目後編輯資料表,可能會影響 Pub/Sub 將訊息寫入資料表的方式。如果變更導致問題,訂閱的狀態欄位會設為錯誤狀態

在訂閱詳細資料頁面中,檢查欄位 Subscription state 的狀態。Subscription state 欄位會提供更明確的錯誤,可能為下列任一項:

  • 找不到資料表:系統已刪除資料表。建立資料表,並檢查資料表的狀態。請參閱「取得資料表資訊」一文。

  • 表格權限遭拒:Pub/Sub 服務帳戶不再具備寫入表格的權限。檢查服務帳戶是否具備正確的權限

  • 資料表結構定義不符:資料表結構定義不再與 BigQuery 訂閱設定相容。檢查結構定義對應是否相容

當 Pub/Sub 訂閱項目處於錯誤狀態時,系統不會將訊息寫入 BigQuery 資料表,而是會將訊息保留在訂閱項目的待處理工作中。請注意,如果已設定,訊息不會傳送至附加的無效信件主題。未確認的訊息會保留 message_retention_duration 中設定的時間(預設為 7 天)。

待辦事項正在累積

如果您發現訂閱項目中積了許多待處理的訊息,或是訊息傳送至訂閱項目的無效信件主題,請查看以下可能的原因。

INVALID_ARGUMENT 錯誤訊息

如果提供的訊息格式在 Pub/Sub 看來有效,但在 BigQuery 目的地資料表結構定義中不符,就會發生這個錯誤。這表示訊息中有一或多個欄位的值不符合 BigQuery 資料表結構定義。請查看結構定義相容性,確認資料類型和格式是否正確。常見的錯誤包括:

  • 空字串 ("") 不是有效的 JSON。將資料傳送至可為空值的 JSON BigQuery 資料表欄時,請提供空 JSON 物件 ({})null,或空 JSON 字串 ("\"\"") 來代表缺少的值。傳送空字串會導致錯誤。

  • 如果訊息欄位值超過 BigQuery 欄位的長度上限,則會因大小限制而失敗。

如要排解 INVALID_ARGUMENT 錯誤,請在感興趣的訂閱項目中新增無效信件主題。dead-letter 主題會擷取無法寫入 BigQuery 的訊息,以及說明失敗原因的 CloudPubSubDeadLetterSourceDeliveryErrorMessage 屬性。

您也可以在Metrics Explorer中查看這些提交失敗。選取指標 pubsub.googleapis.com/subscription/push_request_count,並依 response_code=invalid_argument 篩選。

RESOURCE_EXHAUSTED 錯誤訊息

如果訊息寫入 BigQuery 的速度緩慢,您可能需要增加專案的 Pub/Sub 推送配額或 BigQuery 儲存空間寫入吞吐量配額。如要確認是否遇到配額限制,請檢查推送要求指標 (subscription/push_request_count),看看是否有任何 resource_exhausted 錯誤。

另一種診斷配額問題的方法是檢查專案的配額。在包含 Pub/Sub 資源或 BigQuery 執行個體的專案中,依序前往「IAM 與管理」>「配額」。搜尋相關配額 (pubsub.googleapis.com/regionalpushsubscriberbigquerystorage.googleapis.com/write/append_bytes)。如果需要增加任一配額,您可以申請調整配額

每小時分區資料表,顯示分區 ID 欄中的 __UNPARTITIONED__

當 BigQuery 目的地資料表以小時分區時,資料列一開始會落在 INFORMATION_SCHEMA.PARTITIONS 檢視中標示為 __UNPARTITIONED__ 的特殊分區。這是使用擷取時間分區的資料表的正常行為。

BigQuery 會使用串流緩衝區來改善寫入程序。資料可能會留在 __UNPARTITIONED__ 分割區,直到累積足夠的資料量或至少經過一小時為止。滿足這些條件後,BigQuery 就會將資料重新分割為適當的每小時分區。

您可以使用 INFORMATION_SCHEMA.PARTITIONS 檢視畫面監控 __UNPARTITIONED__ 區隔內的資料。

後續步驟

  • 如果您仍遇到 BigQuery 訂閱問題,請參閱「取得支援」。