Через 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());
}
Вы также можете обернуть вызовы .execute()
внутри операторов try/catch
, перехватывающих IOException
, на случай, если ошибка является какой-то временной ошибкой сетевого подключения (любые ошибки 500 HTTP code
следует просто повторить). Вам также может понадобиться максимальное время ожидания на случай, если что-то заблокирует выполнение задания или вы непреднамеренно повторите попытку из-за ошибки 404 not found
.
Вы также должны уметь обнаруживать 404 not found
ошибки из любого выброшенного IOException
; это может произойти, если вы случайно вошли и удалили задание до завершения опроса, или если ошибка заставила вас ввести вызов waitJob
, несмотря на неудачный вызов SubmitJob
. Вы должны иметь возможность поэкспериментировать с попыткой GET
несуществующего задания и посмотреть, как выглядит ошибка, чтобы в таком случае избежать бесконечного цикла.
person
Dennis Huo
schedule
29.02.2016