gpt4 book ai didi

java - 使用Spark的REST API提交时,driver在哪里运行以及如何访问SparkSession?

转载 作者:行者123 更新时间:2023-12-02 13:09:06 25 4
gpt4 key购买 nike

Spark 允许通过 REST API 提交作业,example scripts 。有Spark REST Client Java API其功能相同,但使用 Java 而不是curl。

1)从我的主应用程序通过 SparkSession 提交的作业:

SparkConf configuration =
new SparkConf()
.setAppName(name)
.setMaster(host)
.setJars(listOfJars)
.setAll(allPropertiesSet);
SparkSession session = SparkSession.builder().config(configuration).getOrCreate();
session.sql(query).collectAsList();
<小时/>

Spark REST API 的特殊之处在于它不与 SparkSession 一起操作。因此,我需要将 MySparkJob 打包到单独的 JAR 中并部署到每个工作人员。

2) 从我的主应用程序通过 REST API 提交的作业:

SparkRestClient client = SparkRestClient
.builder()
.masterHost("cluster.master.host.address")
.sparkVersion("2.0.1")
.build();

final String submissionId = client
.prepareJobSubmit()
.appName("MySparkJob!")
.appResource("file:/home/spark/my-spark-job.jar")
.mainClass("com.vbakh.jobs.MySparkJob")
.submit();

MySparkJob 代码(在哪里执行?与 REST API 调用在同一台计算机上?在 Spark 驱动程序上?还是 Spark 工作线程?) :

public class MySparkJob implements Serializable {

public static void main(String[] args) {
// Question 1: How to make Spark SQL Join here if I haven't got SparkSession?
// Question 2: how to return result of the join to the driver?
}
}

最佳答案

除非我误解了你的问题,否则你应该这样做 SparkSession.builder.getOrCreate 等。请参阅 SparkSession对象API。

<小时/>

无论您使用 spark-submit-way 还是使用 REST API,您的 Spark 应用程序都不会发生任何变化。

换句话说,您使用 REST API 提交的 jar 应该与您使用 spark-submit 提交的 jar 相同。

How can I access SparkSession from the main class of MySparkJob

引用Starting Point: SparkSession中Spark官方文档:

The entry point into all functionality in Spark is the SparkSession class. To create a basic SparkSession, just use SparkSession.builder()

关于另一个问题:

How can I return the result of MySparkJob to the driver?

这个问题让我有点困惑,因为驱动程序是 SparkSession (和 SparkContext)所在的 Spark 应用程序。无论您如何提交 Spark 应用程序,此处都不会发生任何变化。

将任务执行结果发送给驱动程序是 Spark 的主要部分,无论您使用 spark-submit 运行它还是使用 REST API 运行它都不会改变。

<小时/>

话虽如此,让我检查一下您的项目并一一回答。

1) Job submitted through SparkSession from my main app:

正确。在幕后使用 SparkContextSparkSession 会将结构化查询转换为相应的基于 RDD 的管道,该管道将在集群中执行。

2) Job submitted through REST API from my main app:

根据精度级别,它可能不一定正确。

您使用 REST API(正如您使用 spark-submit 提交上面 1 中的代码一样)。这用于提交您的代码以供执行。

因此,2) 中的问题与 1) 中的“通过 REST API 提交的作业”与“通过 SparkSession 提交的作业”不同。

更多的是关于通过 REST API 提交的 Spark 应用程序的 jar(第 2 项)与 spark-submit(第 1 项)。

无论您如何提交 Spark 应用程序 - REST API 与 Spark-submit,main 方法中的代码都不会更改。

where it's executed? On the same machine as REST API call? On the Spark driver? Or Spark worker?)

这是一个非常好的问题,取决于驱动程序的所谓部署模式。您的任务始终在执行器上执行,因此具体位置取决于您的集群(请参阅 Master URLs 中使用 --master 指定的所谓主 URL)。

您无法将应用程序提交给 Spark 驱动程序,因为它是 Spark 应用程序的一部分,而不是执行环境。您只能向 Spark 执行器执行任务。

使用部署模式,情况可能会发生变化(请参阅Launching Applications with spark-submit):

--deploy-mode Whether to deploy your driver on the worker nodes (cluster) or locally as an external client (client) (default: client)

认为SparkRestClient将执行您的驱动程序,就像您使用集群部署模式spark-submited一样,但是这是你必须检查的事情。由于您使用 REST API 提交 Spark 应用程序的 jar,我想不出在 REST API 的主服务器上运行该应用程序的方法。

关于java - 使用Spark的REST API提交时,driver在哪里运行以及如何访问SparkSession?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44025244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com