我有一个本地 Kubernetes 集群(Rancher 桌面),上面从 Bitnami Helm Chart 安装了 Spark(1 个主节点和 2 个工作节点)。
在同一个 Kubernetes 集群上,我有一个 Java 应用程序 (Quarkus),它公开一个 REST GET 端点,并且我希望在调用此端点时提交一个 Spark 作业。最终,我想经常提交许多作业,因此这些提交的性能方面在这里很重要。
Spark 在其核心包中为此在 Java 中提供了 SparkLauncher 类,该类应该用于提交作业。
SparkLauncher 类需要设置“sparkHome”和“master”属性才能提交作业。
我的两个问题是:
目前,我已将 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,没有这样的文件 或目录”
Spark 使用 SPARK_HOME 变量来查找必要的配置、库和可执行文件,默认情况下,如果您没有更改,则它是 /spark 文件夹,但为了安全起见,我建议您进入主容器并运行
echo $SPARK_HOME
。
在 setMaster 中,您应该指出 kubernetes 集群中 Spark Master 的地址和端口,
对于 jar,我建议您将它们存储在 s3 存储桶中,这是最常见的解决方案