在Java中等待Google Dataproc SparkJob的最佳方法是什么?

时间:2016-02-29 16:03:30

标签: apache-spark google-cloud-storage google-cloud-dataproc

我目前正在使用Dataproc的Java Client API通过Spring REST服务触发Spark Job。火花工作的基础是:

  1. 初始化Spark
  2. 处理数据
  3. 将结果存储到GS存储桶.json文件
  4. 我存储数据的原因是,当我的Spark Job完成并将结果存储在JSON文件中时,我可以从REST服务中读取存储的结果。但是,Dataproc的Java客户端API只是触发作业,而不是等待作业完成。那么,等待火花工作完成的最佳方法是什么?我不想使用Object.wait(int time),因为不同的spark作业会有不同的执行时间。

1 个答案:

答案 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一个不存在的作业,并查看错误是什么样的,以避免在这种情况下出现无限循环。