簡體   English   中英

如何使用Google DataProc Java客戶端在相關的GS存儲桶中使用jar文件和類提交spark作業?

[英]How do you use the Google DataProc Java Client to submit spark jobs using jar files and classes in associated GS bucket?

我需要觸發Spark Jobs以使用API​​調用從JSON文件聚合數據。 我使用spring-boot來創建資源。 因此,解決方案的步驟如下:

  1. 用戶使用json文件作為輸入發出POST請求
  2. JSON文件存儲在與數據中心群集關聯的Google存儲桶中。
  3. 在REST方法中使用指定的jar,類和參數觸發聚合spark作業是json文件鏈接。

我希望使用Dataproc的Java Client而不是控制台或命令行來觸發作業。 你怎么做呢?

我們希望很快就會在官方文檔中提供更全面的指南,但要開始使用,請訪問以下API概述: https//developers.google.com/api-client-library/java/apis/dataproc/v1

它包括Dataproc javadocs的鏈接; 如果您的服務器代表您自己的項目而不是代表您的最終用戶的Google項目進行調用,那么您可能希望此處解釋的基於密鑰文件的服務帳戶身份驗證創建用於初始化DataprocCredential對象客戶端存根。

至於dataproc特定的部分,這只是意味着如果使用Maven,則將以下依賴項添加到Maven pom文件中:

<project>
  <dependencies>
    <dependency>
      <groupId>com.google.apis</groupId>
      <artifactId>google-api-services-dataproc</artifactId>
      <version>v1-rev4-1.21.0</version>
    </dependency>
  </dependencies>
</project>

然后你會得到如下代碼:

Dataproc dataproc = new Dataproc.Builder(new NetHttpTransport(), new JacksonFactory(), credential)
    .setApplicationName("my-webabb/1.0")
    .build();
dataproc.projects().regions().jobs().submit(
    projectId, "global", new SubmitJobRequest()
        .setJob(new Job()
            .setPlacement(new JobPlacement()
                .setClusterName("my-spark-cluster"))
            .setSparkJob(new SparkJob()
                .setMainClass("FooSparkJobMain")
                .setJarFileUris(ImmutableList.of("gs://bucket/path/to/your/spark-job.jar"))
                .setArgs(ImmutableList.of(
                    "arg1", "arg2", "arg3")))))
    .execute();

由於不同的中間服務器可能會進行低級重試,或者您的請求可能會拋出IOException而您不知道作業提交是否成功,您可能想要采取的一個額外步驟是生成您自己的jobId ; 那么你知道什么jobId要進行輪詢以確定它是否已經提交,即使你的請求超時或拋出一些未知的異常:

import java.util.UUID;

...

Dataproc dataproc = new Dataproc.Builder(new NetHttpTransport(), new JacksonFactory(), credential)
    .setApplicationName("my-webabb/1.0")
    .build();

String curJobId = "json-agg-job-" + UUID.randomUUID().toString();
Job jobSnapshot = null;
try {
  jobSnapshot = dataproc.projects().regions().jobs().submit(
      projectId, "global", new SubmitJobRequest()
          .setJob(new Job()
              .setReference(new JobReference()
                   .setJobId(curJobId))
              .setPlacement(new JobPlacement()
                  .setClusterName("my-spark-cluster"))
              .setSparkJob(new SparkJob()
                  .setMainClass("FooSparkJobMain")
                  .setJarFileUris(ImmutableList.of("gs://bucket/path/to/your/spark-job.jar"))
                  .setArgs(ImmutableList.of(
                      "arg1", "arg2", "arg3")))))
      .execute();
} catch (IOException ioe) {
  try {
    jobSnapshot = dataproc.projects().regions().jobs().get(
        projectId, "global", curJobId).execute();
    logger.info(ioe, "Despite exception, job was verified submitted");
  } catch (IOException ioe2) {
    // Handle differently; if it's a GoogleJsonResponseException you can inspect the error
    // code, and if it's a 404, then it means the job didn't get submitted; you can add retry
    // logic in that case.
  }
}

// We can poll on dataproc.projects().regions().jobs().get(...) until the job reports being
// completed or failed now.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM