通過Dataproc REST API,在作業上調用GET將返回有關作業狀態的信息。在一般情況下,你可以簡單地有一個輪詢循環:
public static final ImmutableSet<String> TERMINAL_JOB_STATES =
ImmutableSet.of("CANCELLED", "DONE", "ERROR");
// Initialize this as normal with credentials, setAppName, HttpTransport, etc.
private Dataproc dataproc;
public void waitJob(String projectId, String jobId) throws IOException, InterruptedException {
Job job = dataproc.projects().regions().jobs().get(projectId, "global", jobId).execute();
while (!TERMINAL_JOB_STATES.contains(job.getStatus().getState())) {
System.out.println("Job not done yet; current state: " + job.getStatus().getState());
Thread.sleep(5000);
job = dataproc.projects().regions().jobs().get(projectId, "global", jobId).execute();
}
System.out.println("Job terminated in state: " + job.getStatus().getState());
}
您可能還需要包裝內try/catch
報表的情況下,導尿IOException
錯誤的.execute()
電話是某種短暫的網絡連接錯誤的(任何500 HTTP code
錯誤應該只是重試)。您可能還需要最長的等待時間,以防某些事情阻止工作完成,或者您無意中重試了404 not found
錯誤。
你也應該能夠檢測到404 not found
錯誤IOException
;如果您在投票完成之前意外進入並刪除了一項工作,或者如果一個錯誤導致您輸入waitJob
呼叫,但呼叫失敗SubmitJob
,則會發生這種情況。你應該可以嘗試嘗試去找一個不存在的工作,看看在這種情況下錯誤是什麼樣的,以避免無限循環。