当前位置: 首页 > 面试题库 >

您如何使用Google DataProc Java Client通过关联的GS存储桶中的jar文件和类来提交Spark作业?

詹唯
2023-03-14
问题内容

我需要触发Spark Jobs以使用API​​调用从JSON文件聚合数据。我使用spring-boot创建资源。因此,解决方案的步骤如下:

  1. 用户发出带有json文件作为输入的POST请求
  2. JSON文件存储在与dataproc集群关联的Google存储桶中。
  3. 使用指定的jar,类从REST方法内部触发聚集的Spark作业,并且参数为json文件链接。

我希望使用Dataproc的Java Client而不是控制台或命令行来触发作业。你怎么做呢?


问题答案:

我们希望很快能获得有关正式文档的更全面的指南,但要开始使用,请访问以下API概述:https : //developers.google.com/api-client-
library/java/apis/dataproc/v1

它包括到Dataproc javadocs的链接;如果您的html" target="_blank">服务器代表自己的项目而不是最终用户的Google项目进行调用,则您可能希望此处说明的基于密钥文件的服务帐户身份验证创建Credential用于初始化Dataproc客户端存根的对象。

对于特定于dataproc的部分,这仅意味着如果使用Maven,则将以下依赖项添加到Maven pomfile中:

<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.


 类似资料:
  • 真的...已经讨论了很多。 然而,有很多模棱两可之处,提供的一些答案。。。包括在JAR/执行器/驱动程序配置或选项中复制JAR引用。 应为每个选项澄清以下歧义、不清楚和/或省略的细节: 类路径如何受到影响 驾驶员 执行器(用于正在运行的任务) 两者都有 一点也不 对于任务(给每个执行者) 方法 方法 或 ,或者 别忘了,spack-提交的最后一个参数也是一个. jar文件。 我知道在哪里可以找到主

  • 我有一个管道(jenkins)工作,它使用多个存储库。 存储库是这样签出的: 现在,我想在对任何存储库进行提交时触发该作业。如何配置?

  • 问题内容: 在阅读了如何用关联值测试Swift枚举的相等性之后,我实现了以下枚举: 以下代码有效: 但是,这不能编译: …,并显示以下错误消息: 二进制运算符’==’不能应用于类型’CardRank’和’(Int)-> CardRank’的操作数 我假设这是因为它期望使用完整类型,而不指定整个类型,而确实指定了。但是,在这种情况下,我希望它匹配 任何 数字。不只是一个特定的 显然,我可以使用swi

  • 问题内容: 我在Sun上阅读了有关JAR文件的Java教程,但是仍然找不到解决我问题的方法。我需要使用一个名为jtwitter.jar的jar文件中的类,我下载了该文件并尝试执行该文件(昨天我发现可以通过双击来执行.jar文件),而Vista却给我一个错误提示:无法从[路径] /jtwitter.jar加载Main-Class Manifest属性。 编码.jar文件的人要我将其导入,但是在哪里将

  • 问题内容: 是否有任何适用于Node.js的Amazon S3客户端库,允许列出S3存储桶中的所有文件? 最著名的aws2js和knox似乎没有此功能。 问题答案: 实际上,aws2js支持通过方法调用以较低级别列出存储桶中的对象。为此,必须传递在Amazon S3 REST API页面 上记录的参数: 上面片段中的变量包含存储桶中所有对象的列表。

  • 问题内容: 我想使用JSoup将一些文本提交到此表单中。我将如何去做呢? 问题答案: 看一下jsoup.connect方法和Connection接口。 准备好要提交的文本后,可以将其作为表单提交发布到URL。 例如: 返回的对象将是帖子的结果页面。