排解 Cloud Data Fusion 批次管道問題

本頁面說明如何解決 Cloud Data Fusion 批次管道的問題。

管道錯誤:文字檔案忙碌中

執行批次管道時會發生以下錯誤,導致管道失敗:

error=26, Text file busy

如要解決這個問題,請設定觸發條件,在管道失敗時自動重試。

  1. 停止管道
  2. 建立觸發條件。在這種情況下,選取要執行的事件時,請選擇「失敗」。詳情請參閱「在下游管道中建立 inbound 觸發事件」。
  3. 啟動管道

並行管道卡住

在 Cloud Data Fusion 中,執行多個並行批次管道可能會對執行個體造成負擔,導致工作卡在 StartingProvisioningRunning 狀態。因此,您無法透過網頁介面或 API 呼叫來停止管道。同時執行多個管道時,網頁介面可能會變慢或沒有回應。這個問題是因為後端向 HTTP 處理常式提出多個 UI 要求。

如要解決這個問題,請使用 Cloud Data Fusion 流程控制來控管新要求的數量。

在執行管道時,SSH 連線逾時

執行批次管道時發生下列錯誤:

java.io.IOException: com.jcraft.jsch.JSchException:
java.net.ConnectException: Connection timed out (Connection timed out)

如要解決這個問題,請按照下列步驟操作:

  • 檢查是否缺少防火牆規則 (通常是通訊埠 22)。如要建立新的防火牆規則,請參閱「Dataproc 叢集網路設定」。
  • 確認 Compute Engine 強制執行程式允許 Cloud Data Fusion 執行個體與 Dataproc 叢集之間的連線。

回應代碼:401。錯誤:不明錯誤

執行批次管道時發生下列錯誤:

java.io.IOException: Failed to send message for program run program_run:
Response code: 401. Error: unknown error

如要解決這個問題,您必須將 Cloud Data Fusion Runner 角色 (roles/datafusion.runner)授予 Dataproc 使用的服務帳戶。

含有 BigQuery 外掛程式的管道因 Access Denied 錯誤而失敗

已知問題:執行 BigQuery 工作時,管道會發生 Access Denied 錯誤。這會影響使用下列外掛程式的管道:

  • BigQuery 來源
  • BigQuery 接收器
  • BigQuery 多資料表匯出來源
  • 轉換推送

記錄中的錯誤範例 (可能因使用的外掛程式而異):

POST https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/jobs
{
"code" : 403,
"errors" : [ {
"domain" : "global",
"message" : "Access Denied: Project xxxx: User does not have bigquery.jobs.create permission in project PROJECT_ID",
"reason" : "accessDenied"
} ],
"message" : "Access Denied: Project PROJECT_ID: User does not have bigquery.jobs.create permission in project PROJECT_ID.",
"status" : "PERMISSION_DENIED"
}

在這個範例中,PROJECT_ID 是您在外掛程式中指定的專案 ID。外掛程式中指定的專案服務帳戶沒有下列至少一項權限:

  • 執行 BigQuery 工作
  • 讀取 BigQuery 資料集
  • 建立臨時值區
  • 建立 BigQuery 資料集
  • 建立 BigQuery 資料表

如要解決這個問題,請將缺少的角色授予在外掛程式中指定的專案 (PROJECT_ID):

詳情請參閱外掛程式的疑難排解說明文件 (Google BigQuery 多資料表匯入端疑難排解)。

pipeline 不會在錯誤門檻時停止

即使您將錯誤門檻設為 1,管道仍可能在發生多項錯誤後繼續執行。

錯誤門檻適用於在失敗事件中,從指令擲回的任何例外狀況,而該失敗事件並未以其他方式處理。如果指令已使用 emitError API,則不會啟用錯誤門檻。

如要設計在達到特定門檻時失敗的管道,請使用 FAIL 指令

只要條件滿足傳遞至 FAIL 指示詞的條件,就會計入錯誤門檻,且管道會在達到門檻後失敗。

Oracle 批次來源外掛程式會將 NUMBER 轉換為 string

在 Oracle 批次來源版本 1.9.0、1.8.3 和更早版本中,Oracle NUMBER 資料類型 (精確度和比例未定義) 會對應至 CDAP decimal(38,0) 資料類型。

外掛程式 1.9.1、1.8.4 和 1.8.5 不相容於舊版,如果管道中的下游階段依賴來源的輸出結構描述 (因為輸出結構描述已變更),則使用舊版的管道可能無法在升級至 1.9.1、1.8.5 和 1.8.4 後運作。當為 Oracle NUMBER 資料類型定義的輸出結構定義在先前外掛程式版本中未定義精確度和比例時,升級至 1.9.1、1.8.5 或 1.8.4 版本後,Oracle 批次來源外掛程式會針對這些類型擲回下列結構定義不相符的錯誤:Schema field '<field name>' is expected to have type 'decimal with precision <precision> and scale <scale> but found 'string'. Change the data type of field <field name> to string.

1.9.1、1.8.5 和 1.8.4 版本將搭配 CDAP string 資料類型的輸出結構定義,適用於未定義精確度和比例的 Oracle NUMBER 資料類型。如果有任何 Oracle NUMBER 資料類型在 Oracle 來源輸出結構定義中未定義精確度和小數位數,則不建議使用舊版 Oracle 外掛程式,因為這可能導致捨入誤差。

特殊情況是指您使用巨集做為資料庫名稱、結構定義名稱或資料表名稱,但未手動指定輸出結構定義。系統會在執行階段偵測及對應結構定義。舊版 Oracle 批次來源外掛程式會將定義為不含精確度和比例的 Oracle NUMBER 資料類型對應至 CDAP decimal(38,0) 資料類型,而 1.9.1、1.8.5 和 1.8.4 以上版本則會在執行階段將資料類型對應至 string

如要解決在使用 Oracle NUMBER 資料類型時,可能會發生精確度損失的問題,請升級管道,以便使用 Oracle 批次來源外掛程式 1.9.1、1.8.5 或 1.8.4 版本。

升級後,在執行階段,未定義精確度和小數位數的 Oracle NUMBER 資料類型會對應至 CDAP string 資料類型。如果您有使用原始 CDAP decimal 資料類型 (已對應至 Oracle NUMBER 資料類型,且未定義精確度和比例) 的下游階段或接收器,請更新該類型,或讓該類型使用字串資料。

如果您瞭解可能因捨入誤差而導致資料遺失的風險,但選擇使用 Oracle 定義的 NUMBER 資料類型,而未定義精確度和比例,請從 Hub 部署 Oracle 外掛程式 1.8.6 版 (適用於 Cloud Data Fusion 6.7.3) 或 1.9.2 版 (適用於 Cloud Data Fusion 6.8.1),然後更新管道以便改用這些外掛程式。decimal(38,0)

詳情請參閱 Oracle 批次來源參考資料

刪除暫時性 Dataproc 叢集

當 Cloud Data Fusion 在管道執行佈建期間建立暫時的 Dataproc 叢集時,會在管道執行完畢後刪除該叢集。在極少數情況下,叢集刪除作業會失敗。

強烈建議:請升級至最新的 Cloud Data Fusion 版本,確保叢集維護作業正常運作。

設定閒置時間上限

如要解決這個問題,請設定 Max Idle Time 選項。這樣一來,即使管道結束的明確呼叫失敗,Dataproc 也能自動刪除叢集。

Max Idle Time 適用於 Cloud Data Fusion 6.4 以上版本。

建議:如果是 6.6 以下版本,請手動將 Max Idle Time 設為 30 分鐘以上。

手動刪除叢集

如果無法升級版本或設定 Max Idle Time 選項,請改為手動刪除過時的叢集:

  1. 取得建立叢集的每個專案 ID:

    1. 在管道的執行階段引數中,確認 Dataproc 專案 ID 是否已針對執行作業進行自訂。

      確認 Dataproc 專案 ID 是否已針對執行作業進行自訂

    2. 如果未明確指定 Dataproc 專案 ID,請判斷系統使用哪個佈建工具,然後檢查專案 ID:

      1. 在管道執行階段引數中,檢查 system.profile.name 值。

        在執行階段引數中取得佈建工具名稱

      2. 開啟供應者設定,確認是否已設定 Dataproc 專案 ID。如果沒有這項設定或欄位為空白,系統會使用 Cloud Data Fusion 執行個體執行的專案。

  2. 針對每個專案:

    1. 在 Google Cloud 控制台中開啟專案,然後前往 Dataproc「Clusters」(叢集) 頁面。

      前往「叢集」

    2. 依據叢集的建立日期排序,從最舊到最新。

    3. 如果資訊面板未顯示,請按一下「Show info panel」(顯示資訊面板),然後前往「Labels」(標籤)分頁。

    4. 針對每個未使用的叢集 (例如,已過一天以上),請檢查是否有 Cloud Data Fusion 版本標籤。這表示該資料表是由 Cloud Data Fusion 建立。

    5. 勾選叢集名稱旁的核取方塊,然後點選「Delete」

在含有主要或次要工作站的 Dataproc 叢集中執行管道時失敗

在 Cloud Data Fusion 6.8 和 6.9 版本中,如果管道在 Dataproc 叢集中執行,就會發生問題,導致管道失敗:

ERROR [provisioning-task-2:i.c.c.i.p.t.ProvisioningTask@161] - PROVISION task failed in REQUESTING_CREATE state for program run program_run:default.APP_NAME.UUID.workflow.DataPipelineWorkflow.RUN_ID due to
Caused by: io.grpc.StatusRuntimeException: CANCELLED: Failed to read message.
Caused by: com.google.protobuf.GeneratedMessageV3$Builder.parseUnknownField(Lcom/google/protobuf/CodedInputStream;Lcom/google/protobuf/ExtensionRegistryLite;I)Z.

如要解決這個問題,請升級6.8.3.16.9.2.1 或更新版本的修補程式修訂版本。