我目前正在使用Dataproc的Java Client API通过Spring REST服务触发Spark Job。火花工作的基础是:
我存储数据的原因是,当我的Spark Job完成并将结果存储在JSON文件中时,我可以从REST服务中读取存储的结果。但是,Dataproc的Java客户端API只是触发作业,而不是等待作业完成。那么,等待火花工作完成的最佳方法是什么?我不想使用Object.wait(int time),因为不同的spark作业会有不同的执行时间。
答案 0 :(得分:3)
通过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
一个不存在的作业,并查看错误是什么样的,以避免在这种情况下出现无限循环。