如何从 K8s 集群上运行的 Java 应用程序提交 Spark 作业?

问题描述 投票:0回答:1

我有一个本地 Kubernetes 集群(Rancher 桌面),上面从 Bitnami Helm Chart 安装了 Spark(1 个主节点和 2 个工作节点)。

在同一个 Kubernetes 集群上,我有一个 Java 应用程序 (Quarkus),它公开一个 REST GET 端点,并且我希望在调用此端点时提交一个 Spark 作业。最终,我想经常提交许多作业,因此这些提交的性能方面在这里很重要。

Spark 在其核心包中为此在 Java 中提供了 SparkLauncher 类,该类应该用于提交作业。

SparkLauncher 类需要设置“sparkHome”和“master”属性才能提交作业。

我的两个问题是:

  1. 在这种情况下我应该如何配置我的“sparkHome”和“master”以最佳地提交作业(性能方面)?
  2. 我应该将包含自定义 Spark 作业的 JAR 保存在哪里,以便 Spark 集群能够快速看到? JAR 的大小可能约为 2GB。

目前,我已将 Spark“bin”和“jars”目录复制到 Java 应用程序的“Resources”目录,并且我尝试像这样使用 SparkLauncher:

new SparkLauncher()
                .setSparkHome("src/main/resources/spark")
                .setDeployMode("cluster")
                .setMaster("spark://my-spark.default.svc.cluster.local:7077")
                .setAppResource("src/main/resources/spark-examples_2.13-3.5.1.jar")
                .setMainClass("org.apache.spark.examples.SparkPi")
                .startApplication(this);

当我从 Intellij IDEA 执行代码时它可以工作,但在 K8s 集群上失败并出现错误:

“java.io.IOException”,“消息”:“无法运行程序 “src/main/resources/spark/bin/spark-submit”:错误=2,没有这样的文件 或目录”

java apache-spark kubernetes
1个回答
0
投票

Spark 使用 SPARK_HOME 变量来查找必要的配置、库和可执行文件,默认情况下,如果您没有更改,则它是 /spark 文件夹,但为了安全起见,我建议您进入主容器并运行

echo $SPARK_HOME
。 在 setMaster 中,您应该指出 kubernetes 集群中 Spark Master 的地址和端口,

对于 jar,我建议您将它们存储在 s3 存储桶中,这是最常见的解决方案

© www.soinside.com 2019 - 2024. All rights reserved.