排解 Dataproc 工作問題

本文列出常見的工作錯誤訊息,並提供工作監控和偵錯資訊,有助於排解 Dataproc 工作上的問題。

常見的工作錯誤訊息

未取得任務

這表示主要節點上的 Dataproc 代理程式無法從控制層取得任務。通常是由於記憶體不足 (OOM) 或網路問題所導致。若此工作原先能夠順利執行,且網路設定未曾變更,則最可能的原因是記憶體不足,通常是由於提交大量並行執行的工作,或是工作的驅動程式消耗大量記憶體所造成 (例如某些工作會將大型資料集載入記憶體)。

在主要節點上找不到啟用狀態的代理程式

這表示主要節點上的 Dataproc 代理程式尚未啟用,無法受理新工作,通常是由於記憶體不足 (OOM)、網路問題,或是主要節點 VM 狀況不佳所致。若此工作原先能夠順利執行,且網路設定未曾變更,則最可能的原因是記憶體不足,通常是由於提交大量並行執行的工作,或是工作的驅動程式消耗大量記憶體所造成 (會將大型資料集載入記憶體的工作)。

為解決這些問題,請嘗試執行下列動作:

找不到任務

這個錯誤表示叢集在工作執行期間遭到刪除。您可以執行下列動作,識別出執行刪除作業的主體,並確認叢集是在工作執行期間遭到刪除:

  • 查看 Dataproc 稽核記錄,識別出執行刪除作業的主體。

  • 使用 Logging 或 gcloud CLI,確認 YARN 應用程式的最後已知狀態為 RUNNING (執行中):

    • 在 Cloud Logging 中使用下列篩選條件:
    resource.type="cloud_dataproc_cluster"
    resource.labels.cluster_name="CLUSTER_NAME"
    resource.labels.cluster_uuid="CLUSTER_UUID"
    "YARN_APPLICATION_ID State change from"
    
    • 執行 gcloud dataproc jobs describe job-id --region=REGION,然後檢查輸出內容中的 yarnApplications: > STATE
  • 如果刪除叢集主體的帳戶是 Dataproc 服務代理服務帳戶,請檢查叢集所設定的自動刪除時間長度是否短於工作時間長度。

為避免發生 Task not found 錯誤,請使用自動化功能,確保叢集在所有執行中的工作完成之前,都不會遭到刪除。

裝置沒有足夠的空間

Dataproc 會將 HDFS 和暫存資料寫入磁碟。這則錯誤訊息表示叢集建立時並未配置足夠的磁碟空間。請採取下列步驟分析並避免此錯誤:

  • 在 Google Cloud 控制台的「Cluster details」(叢集詳細資料) 頁面中,查看「Configuration」(設定) 分頁下方列出的叢集主要磁碟大小。對於使用 n1-standard-4 機型的叢集,建議磁碟容量至少為 1000 GB,而使用 n1-standard-32 機型的叢集至少應配置 2 TB 容量。

  • 如果叢集磁碟容量低於建議值,請重新建立叢集,並配置建議值以上的磁碟容量。

  • 如果磁碟容量達到建議值以上,請使用 SSH 連線至叢集主 VM,然後在主 VM 上執行 df -h,檢查磁碟使用率,判斷是否需要額外磁碟空間。

  • 收集及檢查磁碟指標

工作監控和偵錯

使用 Google Cloud CLI、Dataproc REST API 和 Google Cloud 控制台對 Dataproc 工作進行分析及偵錯。

gcloud CLI

檢查執行中工作的狀態:

gcloud dataproc jobs describe job-id \
    --region=region

如要查看工作驅動程式輸出內容,請參閱「查看工作輸出內容」。

REST API

呼叫 jobs.get 來檢查工作的 JobStatus.StateJobStatus.SubstateJobStatus.details,以及 YarnApplication 欄位。

控制台

如要查看工作驅動程式輸出內容,請參閱「查看工作輸出內容」。

如要查看 Logging 中的 Dataproc 代理程式記錄檔,請從 Logs Explorer 叢集選取器中,依序選取「Dataproc Cluster」(Dataproc 叢集) →「Cluster Name」(叢集名稱) →「Cluster UUID」(叢集 UUID)

然後使用記錄選取器選取 google.dataproc.agent 記錄檔。

在 Logging 中查看工作記錄檔

如果工作失敗,您可以在 Logging 中存取工作記錄

判斷工作提交者的身分

只需查詢工作的詳細資料,系統就會在 submittedBy 欄位中顯示提交該工作的使用者。例如,下列工作輸出內容顯示將範例工作提交到叢集的使用者是 user@domain

...
placement:
  clusterName: cluster-name
  clusterUuid: cluster-uuid
reference:
  jobId: job-uuid
  projectId: project
status:
  state: DONE
  stateStartTime: '2018-11-01T00:53:37.599Z'
statusHistory:
- state: PENDING
  stateStartTime: '2018-11-01T00:33:41.387Z'
- state: SETUP_DONE
  stateStartTime: '2018-11-01T00:33:41.765Z'
- details: Agent reported job success
  state: RUNNING
  stateStartTime: '2018-11-01T00:33:42.146Z'
submittedBy: user@domain